39

Linux の x86 マシンで gcc 4.5.2 を使用してコンパイルした場合、次の警告はまったく表示されません。

char foo = 255;

しかし、私が使用する-pedanticと、gccは次のように言います:

警告: 暗黙の定数変換でのオーバーフロー

gcc の動作は少し奇妙で、この割り当てで何が起こっているのかを本当に理解しているかどうか疑問に思います。charが POSIX で 8 ビット長で、デフォルトで署名されている場合、保持できないと思います255

C標準では、符号なし整数オーバーフローはオーバーフローになると言っていますが、符号付き整数オーバーフローは定義されていません。では、この割り当ては未定義の動作ですか? そして、なぜgccはこのように振る舞うのでしょうか?

4

3 に答える 3

13

符号付き整数のオーバーフローは、算術式の中間結果を評価するときに発生する場合にのみ、未定義の動作を引き起こします。たとえば、2 進乗算、単項デクリメントなどの場合です。また、浮動小数点値を整数型に変換すると、値が範囲外の場合に未定義の動作が発生します。

符号付き型へのオーバーフロー整数変換は、未定義の動作を引き起こしません。代わりに、実装定義の結果を生成します (実装定義のシグナルが発生する可能性があります)。

于 2013-09-20T17:38:46.600 に答える
9

C11、6.3.1.3 によると:

整数型の値が 以外の別の整数型に変換される_Bool場合、[...] 新しい型が署名され、値を表現できない場合。結果が実装定義であるか、実装定義のシグナルが発生します。

于 2013-09-20T17:37:36.400 に答える