为什么“无符号”映射到MSVC C ++中的32位?

时间:2014-02-25 09:44:52

标签: c++ visual-c++ visual-studio-2008 struct unsigned

我在MSVC ++ 2008中定义了以下结构:

struct{
 Uint16  XDD;
 unsigned XDD_UI:8;
 unsigned XDD_CR:8;
}byte;

在上述结构上执行sizeof时,它表明 unsigned 使用32位来存储数据。

  • 为什么会这样,它与内存对齐有关?
  • 我怎样才能强制编译器只使用8位而不是 触摸结构定义?

3 个答案:

答案 0 :(得分:4)

当您编写unsigned时,这是unsigned int的缩写,在Windows上为32位宽。这意味着它具有4的对齐方式。并且由于你的结构是对齐的,XDDXDD_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字节进行处理。