如果我编写以下代码,编译Code :: Blocks GCC:
struct ByteSize
{
unsigned char Test:64;
};
ByteSize结构的大小为8.这是有道理的。但是当我访问ByteSize的测试时,它仍被视为无符号字符或其他变量吗?这有危险吗?我真的应该这样做吗?编译器是否会将8字节变量转换为单字节char?
答案 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;
}
该值是无符号的,因此不会混淆符号位。该字段被视为所选字段大小的无符号整数。