You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:52:12