我有一个这样的组件的联合:
union byte_real {
double db;
struct {
unsigned long long int mant : 52;
unsigned int exp : 11;
unsigned int sgn : 1;
};
};
它的设计目的是将 64 位双精度数除以 52 位尾数、11 位指数和一位符号。当我将
1.5
加载到 db
时,我预计数据的分布如下:
mant = 0d1000000000000000000000000000000000000000000000000000 = 2251799813685248
exp = 0d01111111111 = 1023
sgn = 0d0 = 0
但它们到底是什么(来自调试器的值):
mant 2251799813685248 unsigned __int64
exp 1228 unsigned int
sgn 1 unsigned int
所以,只有尾数匹配。我使用位字段的方式有什么问题?
在我的双精度和位域结构的联合中如何分配内存?
正如已经评论过的,位域布局是实现定义的。
具体[cppref]
相邻的位字段成员可以(也可以不)打包以共享和跨接各个字节。
GCC 目前认为您的结构是 8 个字节。 MSVC 认为相同的结构是 16 个字节。
我使用位字段的方式有什么问题?
为此目的使用位字段是错误的。 您应该使用一个函数来手动将数据复制为整数类型并检查适当的位。