2

私がこのようなものを持っているとどうなりますか:

int a = 20;
int min = INT_MIN;

if(-a - min)
//do something

正の場合、INT_MIN が INT_MAX より大きいと仮定します。コンパイラによって min が -INT_MIN のように -min のようなものに変換されることはありますか? これは未定義の可能性があります。

4

2 に答える 2

2

適用される単項マイナスINT_MINが未定義になる可能性があることは正しいですが、これはあなたの例では起こりません。

-a - minとして解析され(-a) - minます。変数minはバイナリ減算にのみ関係し、結果を定義するには、最初のオペランドが厳密に負である必要があります。

コンパイラが減算を別のものに変換する場合、新しいバージョンが常に古いバージョンと同じことを計算するようにするのはコンパイラの責任です。

于 2013-09-25T21:24:37.660 に答える
1

の結果は、からx - y減算した数学的な結果として定義されます。数学的な結果を結果の型で表すことができる場合 (この場合)、オーバーフローはありません。yxint

コンパイラは、式を好きなように自由に変換できます。

x - y

x + (-y)

ただし、元の動作が明確に定義されている場合に、変換が同じ動作を維持する場合に限ります。の場合、y == INT_MIN評価の未定義の動作が同じ最終結果をもたらす限り、変換を実行できます-INT_MIN(通常はそうなります)。

タイトルの質問に答えるには:

INT_MIN は、未定義の動作と見なされる整数から減算されますか?

INT_MIN - INT_MIN == 0、オーバーフローできません。

intちなみに、 「整数」というよりも意味があると思います。int数ある整数型の 1 つにすぎません。

于 2013-09-25T21:51:14.240 に答える