1

重複の可能性:
C /C++で整数のオーバーフローを検出するための最良の方法

私はCプログラミングの初心者long intで、一度に1バイトずつ読み取り、空白の最後に印刷するプログラムを作成しました。LONG_MAXライブラリを使用して、およびライブラリLONG_MIN内でオーバーフロー/アンダーフローをキャッチするように構成する必要がありますlimits.h。より高い値までキャストすることは許可されていませlong 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;
}

たとえば、入力が+1の場合、オーバーフローしてオーバーフローし、アンダーフローするとその逆になるif (num < LONG_MIN || num > LONG_MAX)ため、機能していないように見える部分。LONG_MAXLONG_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 に答える