我很困惑为什么结果被转换为 INT_MIN 而不是整数溢出?
有任何想法吗?
#include <stdio.h>
int ft_atoi(const char *str)
{
int sign;
int result;
sign = 1;
result = 0;
while (*str == 32 || (*str >= 9 && *str <= 13))
str++;
if (*str == '+')
str++;
else if (*str == '-')
{
sign = -1;
str++;
}
while (*str >= '0' && *str <= '9')
{
printf("before: %d\n", result);
result = (result * 10) + *str - '0';
printf("after: %d\n", result);
str++;
}
return (sign * result);
}
int main(void)
{
printf("%d\n", ft_atoi("-2147483648"));
return (0);
}
结果:
e1z2r7p5% ./a.out
之前:0
之后:2
之前:2
之后:21
之前:21
之后:214
之前:214
之后:2147
之前:2147
之后:21474
之前:21474
之后:214748
之前:214748
后:2147483
之前:2147483
后:21474836
之前:21474836
后:214748364
之前:214748364
之后:-2147483648
-2147483648
最佳答案
记住有符号整数数量使用最高有效位(最左边...)作为符号位会有所帮助:0
为正,1
是否定的。如果对 32 位整数“加一”0x7FFFFFFF
(除了最左边的所有位),你可能会得到 0x80000000
(最左边的位打开,所有其他位为零),因为最左边的位现在打开,被视为“负数”。而且您可能不会收到“整数溢出”异常。
关于c - 为什么这个程序会自动将结果转换为 INT_MIN 而不是整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59377083/