1

我很无聊,想看看 double 的二进制表示是什么样的。但是,我注意到窗户上有一些奇怪的东西。以下代码行演示

double number = 1;
unsigned long num = *(unsigned long *) &number;
cout << num << endl;

在我的 Macbook 上,这给了我一个非零数字。在我的 Windows 机器上,它给了我 0。

我期待它会给我一个非零数,因为 1.0 作为双精度数的二进制表示不应该全为零。但是,我不确定我想要做的是否是明确定义的行为。

我的问题是,上面的代码是愚蠢和错误的吗?而且,有没有办法可以打印出双精度的二进制表示?

谢谢。

4

2 回答 2

5

1 双是3ff0 0000 0000 0000. long是一个4 字节的 int。在小端硬件上,您正在阅读该0000 0000部分。

于 2013-02-25T22:07:33.437 回答
2

如果您的编译器支持它(GCC 支持),则使用联合。根据 C++ 标准(严格的别名规则),这是未定义的行为:

#include <iostream>
int main() {
    union {
        unsigned long long num;
        double fp;
    } pun;

    pun.fp = 1.0;
    std::cout << std::hex << pun.num << std::endl;
}

输出是

3ff0000000000000
于 2013-02-25T22:17:00.703 回答