C 为什么这个程序会自动将结果转换为INT_MIN而不是整数溢出?
我不明白为什么结果被转换成INT_MIN而不是整数溢出? 有什么想法吗C 为什么这个程序会自动将结果转换为INT_MIN而不是整数溢出?,c,libc,atoi,C,Libc,Atoi,我不明白为什么结果被转换成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 ==
#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);
}
#包括
国际金融中心(常量字符*str)
{
整数符号;
int结果;
符号=1;
结果=0;
虽然(*str==32 | |(*str>=9&&&*str='0'&*str它可以帮助记住,有符号整数数量使用最高有效位(最左边的…)作为符号位:0
为正,1
为负。如果将一个“添加”到32位整数0x7FFFFFFF
(除最左边的位外,所有位均为开),您可能会得到0x8000000
(最左边的位为开,所有其他位为零),因为最左边的位现在为开,因此被视为“负”。并且您可能不会得到“整数溢出”异常。您希望“整数溢出”是什么?有符号整数溢出是未定义的行为。您正在尝试理解未定义的行为。“未定义”意味着,任何事情都可能发生。2147483640+8=-2147483648
在您的平台上,这是预期的“整数溢出”“在大多数平台上,32位有符号数字类型的行为。与-2147483648*-1=-2147483648
相同。与-1
相乘在这里是一个幂等运算,很有趣,不是吗?;)您指的是哪个溢出实例?最后一个结果=(结果*10)+*str-'0';
或符号*结果
?虽然这可能是迄今为止最常见的有符号整数实现,但它仍然依赖于实现。C标准将有符号整数的表示方式留给实现。