开发者

why my value are divided by 2 with bit fields

I got some trouble with bitfields and endian stuff... I confused.

I need to parse some data got from the network, the sent are in lil endian (im using boost::asio)

Can you explain me this

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 b开发者_运维百科y 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


Why are you saying that the second value is "well stored"? Look at your own output: if the first field (_LENGTH) in two is supposed to consist of 9 bits, then the second output is also incorrect. It was supposed to be 00000001 00000000, but instead you got 00000010 00000000, meaning that in two your value got "multiplied" by 2.

I'd guess that your bit_print is broken and prints nonsense.

(Obligatory disclaimer: Bit-field layout is implementation defined. You are not guaranteed anything layout-related in C++ language when you work with bit-fields.)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜