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。
与其他数据类型不同,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);
以下代码无法正常运行。我想让它打印出 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。
与其他数据类型不同,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);