C中更高值的计算

Calculation of higher values in C

以下代码无法正常运行。我想让它打印出 20 亿 + 20 亿的总和。即使我在这里使用 long,我也无法得到正确的答案。

#include<stdio.h>
#include<stdlib.h>

int main(void){

long  a = 2000000000;
long  b = 2000000000;

printf("%li\n",a + b);

return 0;
}

当我运行这个程序时,我得到值-294967296。我正在使用 VS Code IDE、Mingw 编译器和 windows 版本是 windows 11.

long 的最大长度可能与 int 相同,您应该使用 long long。

Integer size in C

与其他数据类型不同,long 整数的大小不是固定的。它因架构、操作系统甚至我们使用的编译器而异。在某些系统中,它的行为类似于 int 数据类型或 long long 数据类型,如下所示:


  OS               Architecture          Size
Windows       IA-32                     4 bytes
Windows       Intel® 64 or IA-64        4 bytes
Linux         IA-32                     4 bytes
Linux         Intel® 64 or IA-64        8 bytes
Mac OS X      IA-32                     4 bytes
Mac OS X      Intel® 64 or IA-64        8 bytes 

long 在您的情况下可能是 32 位。为避免这种混淆,请使用 stdint 在您可以确定尺寸且便于携带的地方

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#include<inttypes.h>

int main(void){

    int64_t  a = 2000000000;
    int64_t  b = 2000000000;

    // printf("%lli\n",a + b);
    printf("res = %" PRI64d "!\n", a+b);

    return 0;
}


long 至少 32 位,其范围必须跨越 至少 +/- 231 - 1 或 +/-2,147,483,647.

在某些机器上 long 更宽,例如 [-263 ... 263 - 1].

在OP的机器上,是[-231 ... 231 - 1].


对于OP。 a + b 发生 有符号整数 溢出,在 未定义行为 (UB) 中,因为两个 long 的总和在 long范围。一个常见的结果是总和被“包装”并导致 long 为 -294,967,296,尽管许多其他结果也是可能的,包括代码崩溃。


要处理像 4,000,000,000 这样的总和,请使用 unsigned long 数学执行加法,其 最小值 范围为 [0 ... 232 - 1] 或使用 long long.

// printf("%li\n",a + b);
printf("%lli\n",0LL + a + b);

或者...

long long  a = 2000000000;
long long  b = 2000000000;
printf("%lli\n",a + b);