我很无聊,想看看double的二进制表示是什么样的。但是,我发现窗户上有些奇怪。以下代码行演示
double number = 1;
unsigned long num = *(unsigned long *) &number;
cout << num << endl;
在我的Macbook上,这给了我一个非零数字。在我的Windows机器上它给我0。
我原以为它会给我一个非零数字,因为作为double的1.0的二进制表示不应该全为零。但是,我不确定我要做的是否是明确定义的行为。
我的问题是,上面的代码是不是很愚蠢?而且,有没有办法可以打印出双精度的二进制表示?
感谢。
答案 0 :(得分:5)
1加倍是3ff0 0000 0000 0000
。 long
是4 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