C 为什么这个程序会自动将结果转换为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 ==

我不明白为什么结果被转换成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);
}
#包括
国际金融中心(常量字符*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标准将有符号整数的表示方式留给实现。