比特设置问题
Bit setting question
在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'被视为一个完整的字节,它的意义是什么?
请随意提及任何其他注意事项(如编译器限制或其他限制)。
谢谢。
本上述技术实际上被称为什么?
。您只应该使用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'被视为一个完整的字节,它的意义是什么?
这是位域。
这些字段如何在内存中安排的细节主要是由实现定义的。通常,您会发现编译器以某种方式打包它们。但它可能会考虑到各种对齐问题。
相关文章:
- 将十六进制值设置为用于填充的字符变量时出现问题
- std::p 设置或多组的修订问题
- 在Visual "Microsoft studio 2019"上设置OpenCV 4.1.1时遇到问题?(非法指令。
- 嵌套的类成员变量不可访问.链表设置.V、下一个和新的问题
- C / C++链接问题与非常简单的设置
- 通过比较字符设置字符串时出现问题
- 在 c++ 中为我的类设置/获取方法时遇到问题
- 在设置 if-else 语句以删除特定货币并保持更新时遇到问题
- Coin-CLP设置的问题
- C 无序的设置问题与结构哈希
- 为 C++ 开发设置 GTK+ 时遇到问题
- 可视C++ 设置串行 COM 端口时出现问题
- 在将结构插入设置C++时遇到问题
- 使用设置精度在C++中舍入小数点时出现问题
- 未在另一个函数中设置变量引用的问题
- 设置Ncurses和C++时出现问题
- C awesomium设置了听众问题
- 为英特尔C++编辑器"GCC not found"设置环境变量时出现问题
- 问题:设置IP
- Eclipse c++ IDE,问题设置