二进制的二进制表示

时间:2013-02-25 22:03:03

标签: c++

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

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

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

我原以为它会给我一个非零数字,因为作为double的1.0的二进制表示不应该全为零。但是,我不确定我要做的是否是明确定义的行为。

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

感谢。

2 个答案:

答案 0 :(得分:5)

1加倍是3ff0 0000 0000 0000long4 byte int。在little endian硬件上,您正在阅读0000 0000部分。

答案 1 :(得分:2)

如果您的编译器支持它(GCC),那么使用union。根据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