// Declaration of data type where 4 bytes are packed into an unsigned.
int xbyte(packed_t word, int bytenum);
int main()
{
int bytenum = 0;
typedef unsigned packed_t;
packed_t word;
}
// Extract byte from word, return as signed integer.
int xbyte(packed_t word, int bytenum)
{
// Failed attempt at xbyte
return ( word >> (bytenum << 3)) & 0xff;
}
我不确定如何在这个问题中声明packed_t。我应该从顶部使用原型。这个词怎么会发挥作用。我迷失了这是家庭作业的一部分。
答案 0 :(得分:2)
您已有typedef
行。将它作为这段代码的第一行,你就完成了。基本的是,typedef
ed名称必须在您使用它的任何地方都可见。
答案 1 :(得分:1)
首先,当然,您可以将packed_t
输入到任何整数类型中
想;在使用packed_t
的任何地方都必须可以看到typedef,
但是。
其次,word >> (bytenum << 3)
有点混淆。你是什么
希望是word >> (bytenum * 8)
,甚至更好:
return (word >> (bytenum * CHAR_BIT)) & ((1 << CHAR_BIT) - 1);
(很难说这里最好的解决方案是什么:上面的表达方式
即使对于字节不是8位的机器,也可以提供便携性
&
右侧的子表达式非常模糊,当然也是如此
值得评论。)
最后:我们应该阅读标题中的任何内容。如果你想要 返回字节的值,好像它是一个有符号的字节,然后你就可以了 需要额外的代码来处理它。对于经典的32位二进制 补机,以下工作:
int tmp = word >> (bytenum * 8);
if ( (tmp & 0x80) != 0 )
tmp |= 0xFFFFFF80;
else
tmp &= 0x7F;
return tmp;
更便携(不是那种不是2的机器的便携性) 补充8位字节非常重要),你必须写:
int tmp = (word >> (bytenum * CHAR_BIT)) & ((1 << CHAR_BIT) - 1);
if ( tmp > SCHAR_MAX )
tmp -= UCHAR_MAX + 1;
return tmp;
但这也取决于实际需要的内容。第n个的值 byte取决于硬件中整数的实际表示。该 上面的代码忽略了这一点,并将低位字节作为字节0返回,而不是 必须是第一个字节。如果你真的想要第n个字节进行某种排序 需要打字:
return *(reinterpret_cast<signed char*>( &word ) + bytenum);
如果没有更多关于所需内容的信息,很难说 应该是什么样的正确答案。
答案 2 :(得分:0)
也许工会在这里很有用
union packed_t
{
unsigned int unsignedInt;
char signedChar[4];
}