unsigned char A:1; unsigned char B:3;
我不熟悉它的具体工作原理,所以有很多问题:
如果我有一个包含以下变量的类:
unsigned char A:1; unsigned char B:3; unsigned char C:1; unsigned char D:3;
>实际上所谓的上述技术是什么?
>上面是四个字节大小,还是一个字节大小?
>如上所示,变量是否被视为1(或3)位,或者根据’unsigned char’被视为每个字节?
>有没有将这些位组合成一个集中字节?例如:
.
unsigned char MainByte; unsigned char A:1; //Can this be made to point at the first bit in MainByte? unsigned char B:3; //Etc etc unsigned char C:1; unsigned char D:3;
>是否有更深入介绍此主题的文章?
>如果’A:1’被视为整个字节,它的点/紫色是什么?
随意提及任何其他考虑因素(如编译器限制或其他限制).
谢谢.
解决方法
What is the above technique actually called?
位字段.并且你只应该使用int(有符号,无符号或其他)作为“类型”,而不是char.
Is above class four bytes in size,or one byte in size?
都不是.它可能是sizeof(int),因为编译器生成一个字大小的对象.但是,实际的位域将存储在一个字节内.它只会浪费一些空间.
Are the variables treated as 1 (or 3) bits as shown,or as per the ‘unsigned char’,treated as a byte each?
它们仅代表指定的位,并将尽可能紧密地打包.
Is there someway of combining the bits to a centralised byte? So for example:
使用联合:
struct bits { unsigned A:1; unsigned B:3; unsigned C:1; unsigned D:3; }; union SplitByte { struct bits Bits; unsigned char Byte[sizeof(struct bits)]; /* the array is a trick so the two fields are guaranteed to be the same size and thus be aligned on the same boundary */ } SplitByteObj; // access the byte SplitByteObj.Byte[0] // access a bitfield SplitByteObj.Bits.B
请注意,位域存在问题,例如使用线程时.无法单独访问每个位域,因此如果您尝试使用互斥锁来保护每个位域,则可能会出错.此外,标准没有明确规定字段布局的顺序.由于这个原因,许多人更喜欢使用按位运算符来手动实现位域.
Is there an article that covers this topic in more depth?
不多.当你使用谷歌时,你会得到的最初几个就是你所能找到的.它们不是广泛使用的构造.你最好挑选标准来弄清楚它们是如何工作的,这样你就不会被一个奇怪的边缘情况所困扰.我无法确切地告诉你它们在标准中的确切位置.
If ‘A:1’ is treated like an entire byte,what is the point/purple of it?
事实并非如此,但我已经解决了这个问题.