【发布时间】:2018-11-07 06:14:55
【问题描述】:
我正在尝试使用printf 将双精度的二进制表示打印到控制台上。这是我到目前为止的代码:
#include <stdio.h>
int main()
{
double a = 4.75;
unsigned long long b = *(unsigned long long *) &a;
printf("Double a = %f (0x%x)" a, b);
}
我也尝试将它从 long long 改为 long。这是我在 gcc linux 中执行此操作得到的结果:
Double a = 4.750000 (0x0)
我很确定,因为我的系统是小端序,它只抓取全为零的前 32 位。但是,我不确定如何解决这个问题。
我认为这可能是因为 long 在 linux 中是 64 位的,但经过测试,我再次得到了相同的结果。也许我打印不正确?不确定,请告诉我,感谢您抽出宝贵时间。
【问题讨论】:
-
*(unsigned long long *) &a;不违反严格别名吗? -
@SouravGhosh 是的,请参阅What is strict aliasing
-
printf("Double a = %f (0x%llx)", a, b); -
@SouravGhosh 该信息适用于可能不理解的普通观众;-)
-
我真的不明白这不是是对严格别名问题的欺骗。如果我们要保持开放,问题需要缩小到 C 或 C++。目前它太宽泛了。如果拥有金牌徽章的高代表用户在写答案之前努力缓和 C 和 C++ 标记的交叉发布方面,将会很有帮助。
标签: c++ c floating-point double type-punning