好吧,我创建了一个位字段
typedef struct
{
unsigned bit : 1;
}BIT;
并且sizeof运算符返回4 ... ergo表示结构不是真的有点,而不是32.有没有办法强制c结构低于所述值?它是否全系统依赖? (我的一本书说一个字符只有1个字节,而对我来说sizeof(char)返回4 ...)
答案 0 :(得分:3)
6.7.2.1结构和联合说明符
...
11实现可以分配任何足够大的可寻址存储单元来保存位域。 如果剩余足够的空间,则紧跟在a中的另一个位字段的位字段 结构应打包到同一单元的相邻位。如果剩余空间不足, 是否将不适合的位域放入下一个单元或重叠相邻单元 实现定义。单位内位域分配的顺序(高位到 实现定义的是低阶或低阶到高阶。对齐 可寻址存储单元未指定。
您的实现显然正在分配一个32位unsigned int
来包含位字段。检查你的编译器文档,看看是否有办法强制它使用较小的类型的位域,虽然我不会屏住呼吸。
答案 1 :(得分:1)
您可以尝试使用unsigned char
或short
作为结构,但也存在对齐问题。
答案 2 :(得分:1)
sizeof(char)
的标准保证返回1
。
到BIT
结构:无法定义需要少于1个字节内存的数据类型。
对于bitfields(:
说明符),如果你真的真的必须以各种可能的方式保存一些内存,你可能会幸运地做到这样的事情:
typedef struct
{
char c1 : 4;
char c2 : 4;
} MyPackedByte;
允许您在单个字节中存储两个4位值,但这可能是特定于编译器的行为,也许您将不得不使用一些预处理器指令,例如#pragma pack
答案 3 :(得分:0)
如果你只需要1位,为什么你有结构?最小的存储单位是一个字节(通常为1个字符);为什么不将typedef BIT变为char?
答案 4 :(得分:0)
你不应该对比特字段使用sizeof()函数。你是如何设置你如何“削减”你的int,也许你可以存储它,如果你真的需要在以后获得它的大小? 就像是 typedef结构 { ``unsigned bit:1,bit2:3;
``size_t size_bit1,size_bit2; } BIT;
void initBIT()
{
size_bit1 = 1;
size_bit2 = 3;
}