我将尝试将一个整数转换为浮点数,方法如下(简化版):
可以看出,即使添加显式转换也无法解决问题。我有点困惑,因为浮点数应该能够容纳更大的数字(绝对值)。如果有影响,
int64_t x = -((int64_t)1 << 63);
float y = x;
在64位Windows 7上使用MSVC 2013可以正常工作,但在Ubuntu 14.04 64位上使用gcc 4.8时,x的值为正数。我禁用了所有优化,并在gdb中查看了变量。我甚至尝试直接使用gdb进行评估,以找到问题的原因:
(gdb) print (float)(-((int64_t)1 << 63))
$33 = 9,22337204e+18
(gdb) print (float)(-9223372036854775808)
$39 = 9,22337204e+18
可以看出,即使添加显式转换也无法解决问题。我有点困惑,因为浮点数应该能够容纳更大的数字(绝对值)。如果有影响,
sizeof(float) == 4
和 sizeof(size_t) == 8
。似乎-2^63这个值是某种魔法限制,因为-2^63+1可以完美转换:(gdb) print (float)(-((int64_t)1 << 63) + 1)
$44 = -9,22337149e+18
为什么在值小于等于-2^63的转换中会丢失符号?int64_t和float都可以表示值-2^63,并且在其他平台上可以正常工作。
(int64_t)1 << 63
将1
左移至符号位,因此是未定义行为。 - Weather Vane(gdb) print (float)(-(int64_t)((uint64_t)1 << 63)) $48 = -9,22337204e+18
。 - Andreas Unterweger-(1 << x)
转换为浮点数,在运行时x=63? - Andreas Unterweger(-(float)((uint64_t)1 << 63))
进行操作了。非常感谢。 - Andreas Unterweger