c - 为什么这个程序会自动将结果转换为 INT_MIN 而不是整数溢出?

标签 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 == '+')
        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/

相关文章:

c - 了解ATOI功能

转换字符串时间戳 HH :MM:SS to an integer in C

iphone - 如何阻止音频文件在 Apple 的 MixerHost 核心音频示例中循环播放

c - 由于舍入,c 中的无限循环?

c - 这可以用 printf 实现吗?

websocket - 将 io 字符串转为 int Atoi 无效参数

c - 无论输入如何,C 中的条件仅打印 1 个结果

c - 读取文本文件错误 : strange '\x01' '\0' '\0' '0' sequences

java - 发射时的致命信号 (KitKat)

rust - 更改Rust打印功能的默认文件描述符