可视化 为什么在 MSVC C++中"unsigned"映射到 32 位?
visual Why is "unsigned" mapped to a 32 bits in MSVC C++?
我在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的排列。由于您的结构是对齐的,所以在XDD
和XDD_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字节进行处理。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- C++匿名结构作为std::映射值
- 可视化 为什么在 MSVC C++中"unsigned"映射到 32 位?