Bitfield对尺寸/类型的影响?

时间:2012-10-29 01:06:56

标签: c++

如果我编写以下代码,编译Code :: Blocks GCC:

struct ByteSize
{
   unsigned char Test:64;
};

ByteSize结构的大小为8.这是有道理的。但是当我访问ByteSize的测试时,它仍被视为无符号字符或其他变量吗?这有危险吗?我真的应该这样做吗?编译器是否会将8字节变量转换为单字节char?

3 个答案:

答案 0 :(得分:1)

Clang发出警告:

warning: size of bit-field 'Test' (64 bits) exceeds the size of its type;
         value will be truncated to 8 bits

此外,如果尝试将大于255的值存储到其中,则会发出警告:

warning: implicit conversion from 'int' to 'unsigned char' changes 
         value from 256 to 0

然后,尝试从它读取产生0.因此,即使sizeof(ByteSize) == 8,它看起来只是作为无符号字符访问它,它不喜欢你实际上可以存储多于1个字节在会员中。

答案 1 :(得分:1)

通过标准,我在§9.6中找到了:

  

常量表达式可能大于中的位数   位字段类型的对象表示(3.9);在这种情况下   额外的比特用作填充比特,不参与   比特字段的值表示(3.9)。

Test是一个位字段,它不是无符号字符或其他类型。这很危险,因为它假定unsigned char可以容纳64位或更多位。你不应该真的这样做。我没有记住所有的转换规则,但是编译器不应该将8字节的非char转换为char,除非你明确告诉它(例如使用强制转换)。

...

您在寻找uint64_t吗?

答案 2 :(得分:0)

声明

struct ByteSize
{
   unsigned char Test:64;
}

不正确。位字段应该只使用裸无符号类型。

struct ByteSize
{
   unsigned Test:64;
}

该值是无符号的,因此不会混淆符号位。该字段被视为所选字段大小的无符号整数。