比特设置问题

Bit setting question

本文关键字:问题 设置      更新时间:2023-10-16

在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. 上述技术实际上被称为什么?
  2. 以上类是四个字节的大小,还是一个字节的大小?
  3. 是否将变量视为1(或3)位,如所示,或按照"unsigned char",作为每个字节处理?
  4. 是否有某种方法将比特组合到一个集中的字节?例如:

.

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;
  1. 是否有更深入地讨论这个主题的文章?
  2. 如果'A:1'被视为一个完整的字节,它的意义是什么?

请随意提及任何其他注意事项(如编译器限制或其他限制)。

谢谢。

上述技术实际上被称为什么?

。您只应该使用int (signed, unsigned或其他)作为"类型",而不是char

class的大小是4个字节还是1个字节?

。它可能是sizeof(int),因为编译器生成一个单词大小的对象。但是,实际的位域将存储在一个字节内。这只会浪费一些空间。

变量是否如所示处理为1(或3)位,或者按照"unsigned char",每个处理为一个字节?

它们只表示指定的位,并将尽可能紧密地打包。

是否有某种方法将比特组合成一个集中的字节?例如:

使用union:

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

请注意位域存在问题,例如在使用线程时。每个位域不能单独访问,所以如果尝试使用互斥锁来保护每个位域,可能会出现错误。此外,标准没有明确规定字段的排列顺序。出于这个原因,许多人更喜欢使用按位运算符手动实现位域。

有没有更深入地讨论这个主题的文章?

不是很多。当你用谷歌搜索时,你会得到的最初的几个就是你能找到的全部。它们并不是一个广泛使用的结构。您最好对标准进行挑剔,以弄清楚它们是如何工作的,这样您就不会被奇怪的边缘情况所困扰。我不能确切地告诉你它们在标准中的具体位置。

如果'A:1'被视为一个完整的字节,它的意义是什么?

这是位域

这些字段如何在内存中安排的细节主要是由实现定义的。通常,您会发现编译器以某种方式打包它们。但它可能会考虑到各种对齐问题。