15

の C で定義されている動作は何UINT_MAX + 1uですか? それがゼロであると仮定することはどれほど安全ですか?

4

4 に答える 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

安全であるべき:

署名されていないオーバーフローに関する Wiki

unsigned int オーバーフローが明確に定義されていることに注意してください。

また、ここにこれに関する全体の質問があります。

于 2013-02-15T16:35:22.573 に答える