给定一个双精度值 x,为什么 (signed long long)(x) != *(signed long long *)(&x)?

问题描述 投票:0回答:1

我想知道为什么下面的代码打印“错误”。

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++ 标准是否提供了打印二进制或十六进制底层表示的任何方法,以便我的打印方案可以被单行函数调用替换?

c++ c type-conversion
1个回答
0
投票

在第一种情况下,编译器执行从 double 到signed long long 的转换。

在第二种情况下,编译器将存储的 double 的内部表示解释为有符号 long long 类型的对象。

© www.soinside.com 2019 - 2024. All rights reserved.