浮点数为 32 位和 64 位二进制表示形式



我需要获取一些浮点值(双精度值(的64位二进制表示(IEEE 754(。 我有这段代码用于浮点数的 32 位二进制表示:

union
{
float input;   // assumes sizeof(float) == sizeof(int)
int   output;
}   data;
data.input = value;
std::bitset<sizeof(float) * CHAR_BIT>   bits(data.output);

在这种情况下,工会与皈依有何关系?为什么我应该使用它? 有没有一些漂亮的方法来做同样的事情来获得 64 位表示?

在这种情况下,

联合与转换有何关系?

在 C11 中,您可以使用unions 来执行"类型双关",这是您在此处转换的本质:将与float关联的位重新解释为(有符号的,假定的 32 位(整数。

为什么我应该使用它?

你不应该使用它。在C++中,这被认为是未定义的行为,虽然许多主流编译器将支持基于联合类型的开箱即用,但不能依赖它们始终提供这种行为,尤其是在将来C++标准发生变化时。

有没有一些漂亮的方法来做同样的事情来获得 64 位表示?

如果您的编译器保证基于联合的类型双关语,则只需将其替换为适当的 64 位整数:

static_assert(sizeof(double) == sizeof(uint64_t));
union {
double input;
uint64_t output;
} data;
data.input = value;
std::bitset<sizeof(double) * CHAR_BIT> bits(data.output);

如果没有,那么就没有很好的方法来做到这一点,但是有一种方法可以在保证定义的行为的同时做到这一点:

static_assert(sizeof(double) == sizeof(uint64_t));
uint64_t output;
double input = value;
memcpy(output, input, sizeof(double));
std::bitset<sizeof(double) * CHAR_BIT> bits(output);

最新更新