の C で定義されている動作は何UINT_MAX + 1u
ですか? それがゼロであると仮定することはどれほど安全ですか?
12858 次
4 に答える
27
標準から(C11、6.2.5/9、強調鉱山):
[...]結果の符号なし整数型で表現できない結果は、結果の型で表現できる最大値よりも 1 大きい数値を法として減らされるため、符号なしオペランドを含む計算はオーバーフローすることはありません。
UINT_MAX
の場合10
:
(10 + 1) % (10 + 1) == 0
したがって、はい、ゼロであると想定しても安全です。
于 2013-02-15T16:35:54.400 に答える
12
符号なしの動作は明確に定義されていますが、符号付き整数のオーバーフローは明確に定義されていないことを強調する価値があります。
C プログラミング言語では、符号付き整数のオーバーフローによって未定義の動作が発生し、符号なし整数のオーバーフローによって数値が 2 のべき乗で減らされます。
この件に関する非常に優れた論文:
C/C++ 整数演算とその結果の例
Expression Result
---------- ------
UINT_MAX+1 0
LONG_MAX+1 undefined
INT_MAX+1 undefined
SHRT_MAX+1 SHRT_MAX+1 if INT_MAX>SHRT_MAX, otherwise undefined
char c = CHAR_MAX; c++ varies
-INT_MIN undefined
(char)INT_MAX commonly -1
1<<-1 undefined
1<<0 1
1<<31 commonly INT_MIN in ANSI C and C++98; undefined in C99 and C++11
1<<32 undefined
1/0 undefined
INT_MIN%-1 undefined in C11, otherwise undefined in practice
于 2013-02-15T16:37:56.793 に答える
5
安全です。C 標準では、符号なし整数のオーバーフローラップアラウンドの結果がゼロになることが保証されています。
于 2013-02-15T16:35:16.537 に答える
2
于 2013-02-15T16:35:22.573 に答える