c - uint64_t 的计算结果错误

标签 c linux math 64-bit

上下文

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/

相关文章:

java - 与apache commons的镜像功能

CRC计算减少

c - 由于缺少类型,构建 uclibc linux 3.10-2 (Debian jessie x86_64) 失败

linux - 仅在复制所有目录后才复制文件

linux - 顶级 unix 命令升序

algorithm - 使用 Kruskal 算法找到图中的最小割点?

c - 插入排序有两个不同的结果

c++ - 无法使用 npapi 获取 DOM 窗口

c++ - 我可以使用 clang 生成与旧 llvm 版本兼容的 llvm IR 吗?

math - 为什么程序不能被证明?