【问题标题】:why my value are divided by 2 with bit fields为什么我的值用位字段除以 2
【发布时间】:2010-09-03 16:37:24
【问题描述】:

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

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

【问题讨论】:

  • bit_print() 是否经过良好测试?
  • 可能无关紧要,但_ID_LENGTH是保留的;您不应使用以___ 开头的名称和大写字母,以防实现定义具有相同名称的宏。
  • bit_print 在这里被用来试图查看内存中发生了什么。事实上,如果当我通过网络发送这些结构时,我认为它被除以二。

标签: c++ endianness bit-fields


【解决方案1】:

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

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

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

【讨论】:

  • 在这两种情况下它们都被二除。他的 bit_print 缺少低位。
  • @Hans Passant:在第二种情况下,我没有看到它被“除”二。如果 9 位长的字段应该占据第二个输出的前 9 位,那么我们当前看到的值为 4,而存储的值为 2。即该值以某种方式“倍增”了 2。
  • 第二个字节是 2,而不是应该的 4。
猜你喜欢
  • 2023-04-06
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2019-02-08
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多