1

私がベンチマークしていたこのコードは、最適化が有効になっているときに実行が停止しないことに気付きました.MinGW 4.7.0でコードブロックを使用しています.

イテレータをunsigned i;ループに変更すると、最適化がオンになって終了します。int i;それ以外の場合は、宣言を使用するために最適化をオフにする必要があります。

int main(void)
{
    int i;
    int a, b;
    a = 5; b = 24;
    for(i = 0; i < 2700000000; i++)
        asm_swap(&a, &b);
    return 0;
}

warning: this decimal constant is unsigned only in ISO C90 [enabled by default]明らかに 27 億定数に言及するものもあります。intこれが何かを変えたりunsigned、この値を運ぶことができるとは思わない. 説明がありません。

intタイプと最適化を有効にすることの問題は何ですか?

4

2 に答える 2

3

お使いのプラットフォームでは、intは 32 ビット幅です。

最大の符号付き 32 ビット整数は 2,147,483,647 です。最大の符号なし 32 ビット整数は 4,294,967,295 です。

したがって、2,700,000,000 は には収まりますが、unsigned intには収まりませんint

これは、 を使用するunsigned intと、プログラムが適切に定義されていることを意味します。ただし、 を使用するintと、プログラムの動作は未定義になります。

于 2013-03-30T10:39:10.270 に答える
1

プラットフォームが 32 ビットの場合、intオーバーフローが発生し、永遠に続くなど、何かが起こる可能性のある未定義の動作領域に行き着きます。

于 2013-03-30T10:40:40.317 に答える