上下文
Debian 64 位。
我有这个代码
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
int main(int argc, char ** argv){
uint64_t b = 5000000000;/* 5 000 000 000 */
uint64_t a = (b*b)/2;
printf("a = %llu\n",a);
return 0;
}
问题
Javascript、我的手持计算器和我操作系统中的虚拟计算器给出的结果是 1.25×10^19 而我上面的 c 程序给出的结果是 a = 3276627963145224192
我做错了什么?
最佳答案
b*b
的中间操作的值大于 64 位寄存器可以容纳的值,因此它会溢出。
因为,b (= 5 000 000 000) > 2^32
,因此,b*b > 2^64
而且,由于 5000000000 * 5000000000/2
永远无法放入 64 位变量中,如果不使用特殊方法(例如使用数组表示数字),则无法在 C 中计算此值。
此外,正如@Joachim Pileborg 所建议的,您应该将 unsigned long long
值分配给 b
as
uint64_t b = 5000000000ull;
关于c - uint64_t 的计算结果错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25624949/