C 为什么uint64\u t上的减号运算符给出错误的结果?
在下面的超级高级代码中,我尝试从一个大数值中减去下一个值。 我不明白为什么这会给我错误的结果。 我正在使用cygwingcc。C 为什么uint64\u t上的减号运算符给出错误的结果?,c,uint64,C,Uint64,在下面的超级高级代码中,我尝试从一个大数值中减去下一个值。 我不明白为什么这会给我错误的结果。 我正在使用cygwingcc。 $gcc--version为我提供了gcc(gcc)6.4.0 uint64_t val = 0xFFFFFFFFFFFFFFFFULL; // 0xFF FF FF FF FF FF FF FF ULL = 8 bytes printf("[ 0] %ju\n", val); printf("[ 1] %ju
$gcc--version
为我提供了gcc(gcc)6.4.0
uint64_t val = 0xFFFFFFFFFFFFFFFFULL; // 0xFF FF FF FF FF FF FF FF ULL = 8 bytes
printf("[ 0] %ju\n", val);
printf("[ 1] %ju\n", val -= 1e19);
printf("[ 2] %ju\n", val -= 8e18);
printf("[ 3] %ju\n", val -= 4e17);
printf("[ 4] %ju\n", val -= 4e16);
printf("[ 5] %ju\n", val -= 6e15);
printf("[ 6] %ju\n", val -= 7e14);
gcc-Wall-main.c-o main.exe&&./main.exe
给出如下结果:
[ 0] 18446744073709551615
[ 1] 8446744073709551616 <- here and below should be 5
[ 2] 446744073709551616
[ 3] 46744073709551616
[ 4] 6744073709551616
[ 5] 744073709551616
[ 6] 44073709551616
[0]18446744073709551615
[1]8446744073709551616请注意,1e19
是一个double
(浮点)常量,而不是整数值。1e19
是浮点,-=
再次进行转换。没有错误是例外,因为浮点是近似值。是的,这就是原因。。。为什么我之前没有注意到。。。多谢各位。