1

可能重复:
在 C/C++ 中检测整数溢出的最佳方法

我是 C 编程的初学者,我编写了一个程序来long int一次读取字节并在空格末尾打印出来。我需要将其配置为使用库中的和捕获溢出/下LONG_MAX溢。我不允许投射任何高于 的东西,而且它也应该检测负数的溢出。这是我的代码:LONG_MINlimits.hlong int

int main(void)
{
    int c;
    int state;
    long int num = 0;

    while((c = getchar()) != EOF)
    {
        switch(state)
        {
            case 0:
            {
                if (isspace(c))
                {
                    //do nothing;
                }
                else
                {
                    state = 1;
                    num = 10 * num + (c - '0');
                }
                break;
            }

            case 1:
            {
                if (isspace(c))
                {
                    printf("%ld\n", num);
                    num = 0;
                    state = 0;
                    break;
                }

                num = 10 * num + (c - '0');

                if (num < LONG_MIN || num > LONG_MAX)
                {
                    printf("overflow\n");
                    break;
                }
                break;
            }
        }
    }
    return 0;
}

if (num < LONG_MIN || num > LONG_MAX)似乎不起作用的部分,因为例如,如果输入为LONG_MAX+1,则在下溢LONG_MIN时它会溢出并变为,反之亦然。

4

1 回答 1

0

检测溢出的最简单方法是检查以确保“num”总是比以前大。

oldnum = num;
num = 10 * num + (c - '0');

if (num < oldnum)
{
    // overflow!
    printf("overflow\n");
}

有一些边缘条件需要考虑,但无论 num 是带符号的、无符号的还是它的宽度是什么,以上都应该主要工作。

于 2012-06-17T06:48:52.323 回答