0
int sum; 

int N で表される最大数は 2^0 + 2^1 + ... + 2^(sizeof(int)*8-1) です。sum = N + N と設定するとどうなりますか? 私はプログラミングに少し慣れていないので、あなたは新しいです。

4

2 に答える 2

4

加算の結果が( .. ) でint表現できる値の範囲を超えた場合、オーバーフローが発生します。intINT_MININT_MAX

符号付き整数型の場合、整数オーバーフローの動作は未定義です。

多くの実装では、通常、数学的な結果の下位 N ビット (N は のビット数) を除くすべてを無視することと一致する結果が得られますint言語はそれを保証しません。

さらに、コンパイラは、コードの動作が定義されていると想定し、その想定に基づいて最適化を実行することが許可されてます。

たとえば、clang++ 3.0 では、このプログラムは次のようになります。

#include <climits>
#include <iostream>

int max() { return INT_MAX; }

int main()
{
    int x = max();
    int y = x + 1;
    if (x < y) {
        std::cout << x << " < " << y << "\n";
    }
}

でコンパイルすると何も出力されません-O0が、出力されます

2147483647 < -2147483648

-O1以上でコンパイルされた場合。

まとめ:そんなことしないでください。

(ちなみに、型の表現可能な最大値は、intより単純に 2 N-1 -1 として表されます。ここで、N は型のビット単位の幅です。intまたは、より単純INT_MAXに .32 ビットの典型的なシステムではint、2 31です。 -1、または2147483647. また、 は 8 ビットの単位であると仮定していsizeofます; 実際にはCHAR_BITビットの単位であり、CHAR_BIT少なくとも8 ですが、(非常にまれに) それより大きくなる可能性があります。)

于 2013-11-04T18:32:28.483 に答える