我在MSVC ++ 2008中定义了以下结构:
struct{
Uint16 XDD;
unsigned XDD_UI:8;
unsigned XDD_CR:8;
}byte;
在上述结构上执行sizeof时,它表明 unsigned 使用32位来存储数据。
答案 0 :(得分:4)
当您编写unsigned
时,这是unsigned int
的缩写,在Windows上为32位宽。这意味着它具有4
的对齐方式。并且由于你的结构是对齐的,XDD
和XDD_UI
之间有两个字节填充,结构末尾有两个字节填充。
您的结构布局如下:
0-1 XDD 2-3 <padding> 4-4 XDD_UI 5-5 XDD_CR 6-7 <padding>
如果你想要打包结构,那么你需要打包它。使用#pragma pack
来实现这一目标。但是,即使你这样做,编译器也会生成一个大小为6的结构。这是因为位域被打包成unsigned int
,所以你的两个位域总是消耗4个字节。
如果你确定你的位域被声明为一个大小不超过2个字节的类型,那么你的结构将是4个字节。对于对齐的结构,情况也是如此。例如,此结构的大小为4。
struct s {
unsigned short XDD;
unsigned short XDD_UI:8;
unsigned short XDD_CR:8;
};
但是,在没有位域声明你的结构的情况下,我觉得更明智:
struct s {
Uint16 XDD;
unsigned char XDD_UI;
unsigned char XDD_CR;
};
您可以声明该结构已对齐并具有所需的布局。
答案 1 :(得分:1)
And how could I force the compiler to use only 8 bits as defined without touching the struct definition
使用#pragma
#pragma pack(1)
struct{
Uint16 XDD;
unsigned XDD_UI:8;
unsigned XDD_CR:8;
}byte;
#pragma pack()
答案 2 :(得分:-2)
取决于编译器和机器,unsigned也可能是64位。由于以前的处理器是32位,所以将32位用于int是常见的规范。但我们不应该依赖于int或unsigned来始终确定它的范围。
char或unsgined char确定使用8位的方法。但内部编译器可能已将其调整为4字节进行处理。