在C语言中计算更高数值的方法

3
以下代码不能正确运行。我想让它打印出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。


5
sizeof(long) 是多少?在我的系统中(MS VC),它和 int 一样是 4 字节。因此,使用 long 没有任何意义。请注意,这不是解释。 - Weather Vane
5
尝试使用long long%lli代替。 - Some programmer dude
3
建议使用<stdint.h>中的int_least64_t类型,而不是未定义的longlong long类型。 - user3840170
@WeatherVane "永远使用long没有意义" --> 绝大部分情况的确如此。但在文件大小方面,例如在ftell()中仍然有用,尽管文件大小有时会超过LONG_MAX而变得不稳定。 short 也有其局限性。 long, short 完全没有受到重视(参考链接: https://www.youtube.com/watch?v=ZCVR_ajL_Eo)。 - chux - Reinstate Monica
尝试使用 unsigned long - Déjà vu
3个回答

4

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这样的求和,可以使用其最小范围为[0 ... 232 - 1] 的unsigned long 数学运算,或使用 long long

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

Or ...

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

2
< p > < code > 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 不是 int。它们可能具有相同的大小和宽度,但它们始终是不同的类型。 - Eric Postpischil
2
不应使用"%lli"来转换int64_t。正确的方法是包含<inttypes.h>并使用"%" PRI64d "\n" - Eric Postpischil
"长整型的大小与其他数据类型不同,它是非固定的。你应该重新措辞一下。不同于哪些其他数据类型呢?int和short都是非固定的。char是固定的,意思是它总是一个字节,但它的规定要求至少有8位。" - klutt
关于“long整数的大小不像其他数据类型一样是固定的”:C标准没有规定任何整数数据类型的大小或宽度,除了_Bool的某些方面。signed char至少必须为8位,但可以更宽。short int至少应与signed char一样宽,并且至少为16位,但可以更宽。int至少应与short char一样宽,并且至少为16位,但可以更宽。long int至少应与int一样宽,并且至少为32位,但可以更宽。long long int至少应与long int一样宽,并且至少为64位,但可以更宽。 - Eric Postpischil
1
balu,“Windows Intel® 64或IA-64 4字节”错误地暗示了大小是操作系统的选择。它是由编译器选择受操作系统影响的。例如:在Windows 64上,gcc可能会使用64位的long - chux - Reinstate Monica

-3

2
long 的大小可能与 int 相同。这取决于编译器、目标系统和其他因素。 - Some programmer dude
链接的文档仅涉及微软的编译器,OP使用的编译器不是这个。 - Mathieu
如果OP正在使用GCC,长整型值可能与GCC大小相同。 - pnonnen
1
“long”类型的最大大小与“int”类型不同。这并非总是正确的,您应该更清楚地表达您的意思。 - klutt
1
目前你的回答不够清晰,请[编辑]以添加更多细节,帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接