为什么我的值被比特字段除以2

时间:2010-09-03 16:37:25

标签: c++ endianness bit-fields

我遇到了bitfields和endian东西的麻烦...... 我很困惑。

我需要解析一些从网络中获取的数据,发送的是lil endian(即使用boost :: asio)

你能解释一下吗

struct TEST
{
 unsigned short _last : 1;
 unsigned short _ID : 6;
 unsigned short _LENGH : 9;

};
struct TEST2
{
 unsigned short _LENGH:9 ;
 unsigned short _ID:6 ;
 unsigned short _last:1 ;
};


int main(int argc, char* argv[])
{
 printf("Hello World!\n");

 TEST one;
 one._ID    = 0;
 one._last  = 0;
 one._LENGH = 2; //the value affected here is always divided by 2, it is multiplied by 2 when i cast a short to this structure

 TEST2 two;
 two._ID   =  0;
 two._last  = 0;
 two._LENGH = 2; //the value here is well stored


 bit_print((char*)&one,2);
 bit_print((char*)&two,2);
 return 0;
}

[OUTPUT]

00000000 00000001

00000010 00000000

1 个答案:

答案 0 :(得分:3)

为什么你说第二个值是“存储良好”?查看您自己的输出:如果_LENGTH中的第一个字段(two)应该由9位组成,那么第二个输出也是错误的。它应该是00000001 00000000,而是你得到00000010 00000000,这意味着在two中你的价值被“乘以”2。

我猜你的bit_print已被打破并打印废话。

(强制性免责声明:位字段布局是实现定义的。当您使用位字段时,不能保证C ++语言中与布局相关的任何内容。)