如何使数据类型小于32位

时间:2013-10-02 15:41:05

标签: c memory byte sizeof bit

好吧,我创建了一个位字段

typedef struct 
{
    unsigned bit : 1;
}BIT;

并且sizeof运算符返回4 ... ergo表示结构不是真的有点,而不是32.有没有办法强制c结构低于所述值?它是否全系统依赖? (我的一本书说一个字符只有1个字节,而对我来说sizeof(char)返回4 ...)

5 个答案:

答案 0 :(得分:3)

N1570

6.7.2.1结构和联合说明符
...
11实现可以分配任何足够大的可寻址存储单元来保存位域。 如果剩余足够的空间,则紧跟在a中的另一个位字段的位字段 结构应打包到同一单元的相邻位。如果剩余空间不足, 是否将不适合的位域放入下一个单元或重叠相邻单元 实现定义。单位内位域分配的顺序(高位到 实现定义的是低阶或低阶到高阶。对齐 可寻址存储单元未指定。

您的实现显然正在分配一个32位unsigned int来包含位字段。检查你的编译器文档,看看是否有办法强制它使用较小的类型的位域,虽然我不会屏住呼吸。

答案 1 :(得分:1)

您可以尝试使用unsigned charshort作为结构,但也存在对齐问题。

答案 2 :(得分:1)

sizeof(char)的标准保证返回1

BIT结构:无法定义需要少于1个字节内存的数据类型。

对于bitfields(:说明符),如果你真的真的必须以各种可能的方式保存一些内存,你可能会幸运地做到这样的事情:

typedef struct 
{
    char c1 : 4;
    char c2 : 4;
} MyPackedByte;

允许您在单个字节中存储两个4位值,但这可能是特定于编译器的行为,也许您将不得不使用一些预处理器指令,例如#pragma pack

请参阅:#pragma pack effect

答案 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; }