2011-09-06 50 views
0
// 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。我应该使用顶部的原型。这个词甚至可以发挥作用。我迷路了,这是家庭作业的一部分。4个有符号的字节打包成一个32位无符号的

+0

请将此标记为家庭作业 –

+0

'typedef unsigned packed_t;'有什么问题? – Dani

+0

我无法弄清楚它有什么问题,它似乎很好。我将它初始化为什么? – KDW

回答

2

您已有typedef一行。把它作为这段代码的第一行,你就完成了。基本的事情是,在你使用它的任何地方都必须显示ed名称。

+0

把它放在主体的顶部或主要的 – KDW

+0

正如我所说的,把*放在这个代码片段的最顶端*。 –

0

也许是联盟会在这里

union packed_t 
{ 
    unsigned int unsignedInt; 
    char signedChar[4]; 
} 
1

首先,当然,你可以的typedef packed_t有用的任何整型你 想;但是,typedef必须在任何地方都可见packed_t, 。

其次,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个字节的值取决于硬件中整数的实际表示。上面的代码忽略了这一点,并将低位字节作为字节0返回,而不是 必然是第一个字节。如果你真的想要的第n个字节所需的类型双关的某种 :

return *(reinterpret_cast<signed char*>(&word) + bytenum); 

没有为需要什么样的信息,这是很难说 正确的答案应该是什么。

相关问题