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

C#整数反转函数处理负数及INT_MIN溢出问题求助

解决C#整数反转中INT_MIN溢出的问题

你的核心问题是int.MinValue(即-2147483648)取绝对值时会溢出,因为它的绝对值超过了int.MaxValue(2147483647)。以下是几种可行的解决方案:

方案1:直接处理负数,避免转绝对值

C#中负数的取模和除法操作会保留符号特性,比如-123 % 10返回-3,-123 / 10返回-12,可以直接基于原数的正负处理每一位,无需转绝对值:

public void Reverse(int x)
{
    const int INT_MAX = 2147483647;
    const int INT_MIN = -2147483648;

    long reversed = 0;

    while (x != 0)
    {
        int lastDigit = x % 10;
        reversed = reversed * 10 + lastDigit;
        
        // 提前判断是否超出int范围,超出直接置0并终止循环
        if (reversed > INT_MAX || reversed < INT_MIN)
        {
            reversed = 0;
            break;
        }
        
        x = x / 10;
    }

    Console.WriteLine((int)reversed);
}

方案2:先转long类型处理,规避绝对值溢出

将输入的int转为long后,其范围足以容纳int.MinValue的绝对值,再按原逻辑处理:

public void Reverse(int x)
{
    const int INT_MAX = 2147483647;
    const int INT_MIN = -2147483648;

    long num = x;
    bool isNegative = num < 0;
    
    if (isNegative)
    {
        num = -num; // long类型无溢出风险
    }

    long reversed = 0;
    while (num != 0)
    {
        int lastDigit = (int)(num % 10);
        reversed = reversed * 10 + lastDigit;
        num = num / 10;
    }

    if (isNegative)
    {
        reversed = -reversed;
    }

    // 判断反转结果是否在int范围内
    if (reversed > INT_MAX || reversed < INT_MIN)
    {
        Console.WriteLine(0);
        return;
    }

    Console.WriteLine((int)reversed);
}

方案3:纯int操作,提前预判溢出

如果不想使用long类型,可以在每一步计算前判断是否会溢出,完全基于int类型处理:

public void Reverse(int x)
{
    const int INT_MAX = 2147483647;
    const int INT_MIN = -2147483648;

    int reversed = 0;
    while (x != 0)
    {
        int lastDigit = x % 10;
        
        // 预判正数溢出:reversed超过INT_MAX/10,或等于时最后一位大于7
        if (reversed > INT_MAX / 10 || (reversed == INT_MAX / 10 && lastDigit > 7))
        {
            reversed = 0;
            break;
        }
        // 预判负数溢出:reversed小于INT_MIN/10,或等于时最后一位小于-8
        if (reversed < INT_MIN / 10 || (reversed == INT_MIN / 10 && lastDigit < -8))
        {
            reversed = 0;
            break;
        }

        reversed = reversed * 10 + lastDigit;
        x = x / 10;
    }

    Console.WriteLine(reversed);
}

内容的提问来源于stack exchange,提问作者Murat Ishenbaev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:24:58