我在位域和字节序方面遇到了麻烦...
我很困惑

我需要解析从网络获取的一些数据,发送的数据是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;
}


[输出]

00000000 00000001

00000010 00000000

最佳答案

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

我猜你的bit_print坏了,打印废话了。

(强制性免责声明:位域布局是由实现定义的。使用位域时,不能保证在C ++语言中与布局有关的任何事情。)

关于c++ - 为什么用位域将我的值除以2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3637757/

10-11 15:16