int sum;
int N で表される最大数は 2^0 + 2^1 + ... + 2^(sizeof(int)*8-1) です。sum = N + N と設定するとどうなりますか? 私はプログラミングに少し慣れていないので、あなたは新しいです。
int sum;
int N で表される最大数は 2^0 + 2^1 + ... + 2^(sizeof(int)*8-1) です。sum = N + N と設定するとどうなりますか? 私はプログラミングに少し慣れていないので、あなたは新しいです。
加算の結果が( .. ) でint
表現できる値の範囲を超えた場合、オーバーフローが発生します。int
INT_MIN
INT_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 ですが、(非常にまれに) それより大きくなる可能性があります。)