Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么uint64\u t上的减号运算符给出错误的结果?_C_Uint64 - Fatal编程技术网

C 为什么uint64\u t上的减号运算符给出错误的结果?

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

在下面的超级高级代码中,我尝试从一个大数值中减去下一个值。 我不明白为什么这会给我错误的结果。 我正在使用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\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
是浮点,
-=
再次进行转换。没有错误是例外,因为浮点是近似值。是的,这就是原因。。。为什么我之前没有注意到。。。多谢各位。