可视化 为什么在 MSVC C++中"unsigned"映射到 32 位?

visual Why is "unsigned" mapped to a 32 bits in MSVC C++?

本文关键字:映射 unsigned 可视化 MSVC C++ 为什么      更新时间:2023-10-16

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

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

当对上面的结构进行sizeof时,它显示unsigned使用32位来存储数据。

  • 为什么,这与内存对齐有关吗
  • 我怎么能强迫编译器只使用定义的8位触摸结构定义

当您编写unsigned时,它是unsigned int的缩写,在Windows上为32位宽。这意味着它具有CCD_ 3的排列。由于您的结构是对齐的,所以在XDDXDD_UI之间有两个字节的填充,在结构的末尾有两个字符的填充。

您的结构布局如下:

0-1 XDD2-3<填充>4-4 XDD_UI5-5 XDD_CR6-7<填充>

如果你想打包结构,那么你需要打包它。使用#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;
};

您可以声明该结构已对齐,并具有所需的布局。

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()

根据编译器和机器的不同,unsigned也可能是64位。由于以前的处理器是32位的,所以使用32位来表示int成为了常见的规范。但我们不应该总是依赖int或unsigned来确定它的范围。

一个字符或未经引擎处理的字符肯定可以使用8位。但内部编译器可能已经对其进行了调整,将其用作4字节进行处理。