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实际上应该是零。请任何人都可以帮忙。 谢谢
答案 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