我想知道为什么下面的代码打印“错误”。
double x = 0x8000000000000000;
signed long long v1 = (signed long long)(x);
signed long long v2 = *(signed long long *)(&x);
printf( v1 == v2? "correct\n" : "wrong\n" );
我尝试通过下面的代码分别打印出 v1 和 v2 的二进制表示:
printf( "v1 = 0b" );
for ( int i = 63; i > 0; i-- ) {
printf( "%d", ( ( v1 >> i ) & 1 ) );
}
printf( "\n" );
printf( "v2 = 0b" );
for ( int i = 63; i > 0; i-- ) {
printf( "%d", ( ( v2 >> i ) & 1 ) );
}
printf( "\n" );
事实证明 v1 是正确的,但 v2 是
0b010000111110000000000000000000000000000000000000000000000000000
。
有人可以好心地教一下这里发生的事情吗?
另外,我想知道 C/C++ 标准是否提供了打印二进制或十六进制底层表示的任何方法,以便我的打印方案可以被单行函数调用替换?
在第一种情况下,编译器执行从 double 到signed long long 的转换。
在第二种情况下,编译器将存储的 double 的内部表示解释为有符号 long long 类型的对象。