我的双精度和位域结构体的联合中内存是如何分配的?

问题描述 投票:0回答:1

我有一个这样的组件的联合:

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

所以,只有尾数匹配。我使用位字段的方式有什么问题?

c++ struct unions bit-fields
1个回答
0
投票

在我的双精度和位域结构的联合中如何分配内存?

正如已经评论过的,位域布局是实现定义的。

具体[cppref]

相邻的位字段成员可以(也可以不)打包以共享和跨接各个字节。

GCC 目前认为您的结构是 8 个字节。 MSVC 认为相同的结构是 16 个字节。

我使用位字段的方式有什么问题?

为此目的使用位字段是错误的。 您应该使用一个函数来手动将数据复制为整数类型并检查适当的位。

© www.soinside.com 2019 - 2024. All rights reserved.