使用long类型计算两数之和返回负数结果的技术咨询
问题分析与解决
你的问题是有符号整数溢出导致的。
long类型的取值范围是有限的:比如32位系统里long是4字节,最大值是2147483647,如果两个数相加的结果超过这个值,就会触发有符号整数溢出——这在C标准里属于未定义行为,但大多数编译器会按补码规则回绕,结果就变成了负数。
解决办法
有两种常见思路:
- 先做溢出检查,再计算
- 用更大的整数类型存储计算结果(比如
long long,它的取值范围比long更大,64位系统里是8字节,最大值到9223372036854775807)
修正后的代码示例
如果选择用更大的类型,代码可以改成这样:
#include <stdio.h> int main(void) { long x; long y; printf("enter x:\n"); scanf("%ld", &x); printf("enter y:\n"); scanf("%ld", &y); // 用long long存储相加结果,避免溢出 long long sum = (long long)x + y; printf("%lld\n", sum); }
如果要加溢出检查,可以在计算前判断:
#include <stdio.h> #include <limits.h> // 用来获取long的最大值LONG_MAX int main(void) { long x; long y; printf("enter x:\n"); scanf("%ld", &x); printf("enter y:\n"); scanf("%ld", &y); // 检查溢出:如果x > LONG_MAX - y,说明相加会溢出 if (x > LONG_MAX - y) { printf("相加结果溢出,无法正确计算\n"); } else { printf("%ld\n", x + y); } return 0; }
内容的提问来源于stack exchange,提问作者Vazhun
相关产品推荐
相关产品推荐

