c – 位设置问题

前端之家收集整理的这篇文章主要介绍了c – 位设置问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在C或C中,显然可以限制变量的位数,例如:
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?

事实并非如此,但我已经解决了这个问题.

原文链接:https://www.f2er.com/c/116602.html

猜你在找的C&C++相关文章