如何在c中检查32位有符号整数的整数溢出

时间:2017-06-03 09:26:13

标签: c

int reverseNumber(int x){
long k = x;
long result=0;
int negative=0;
if (k < 0)
{
    negative = 1;
    k = 0 - k;
}
while (k != 0)
{
    result = (result * 10) +( k % 10);
    k /= 10;

}
if (result >INT_MAX)
    return 0;
else
{
    if (negative == 1)
        return (0-(int)result);
    else
        return (int)result;
}
}

这是用于反转32位整数并检查整数溢出条件的函数代码。代码必须为溢出情况返回0,否则返回反转的数字。对于输入2147483647(INT_MAX)我仍然得到输出 - 1126087180实际上应该是零。请任何人都可以帮忙。                  谢谢

1 个答案:

答案 0 :(得分:1)

这是一个混合不同整数类型的版本。所有计算都保持为int。通过这种方式,您无需关心不同整数类型的大小。

注意此部分仅处理x>=0

#include <stdio.h>
#include <limits.h>

int reverseNumber(int x){
    int result=0;
    if (x < 0)
    {
        printf("This version requires x >= 0\n");
        exit(1);
    }
    while (x != 0)
    {
        if (result > INT_MAX/10)  // Check for overflow before multiplying
        {
            return 0; // Will overflow
        }
        result = 10 * result;

        if (result > (INT_MAX - (x % 10)))   // Check for overflow before adding
        {
            return 0; // Will overflow
        }
        result = result + (x % 10);

        x /= 10;
    }

    return result;
}

int main(void) {
    printf("%d\n", reverseNumber(INT_MAX));
    printf("%d\n", reverseNumber(2147483412));
    return 0;
}

<强>输出:

0
2143847412