私がこのようなものを持っているとどうなりますか:
int a = 20;
int min = INT_MIN;
if(-a - min)
//do something
正の場合、INT_MIN が INT_MAX より大きいと仮定します。コンパイラによって min が -INT_MIN のように -min のようなものに変換されることはありますか? これは未定義の可能性があります。
私がこのようなものを持っているとどうなりますか:
int a = 20;
int min = INT_MIN;
if(-a - min)
//do something
正の場合、INT_MIN が INT_MAX より大きいと仮定します。コンパイラによって min が -INT_MIN のように -min のようなものに変換されることはありますか? これは未定義の可能性があります。
適用される単項マイナスINT_MIN
が未定義になる可能性があることは正しいですが、これはあなたの例では起こりません。
-a - min
として解析され(-a) - min
ます。変数min
はバイナリ減算にのみ関係し、結果を定義するには、最初のオペランドが厳密に負である必要があります。
コンパイラが減算を別のものに変換する場合、新しいバージョンが常に古いバージョンと同じことを計算するようにするのはコンパイラの責任です。
の結果は、からx - y
減算した数学的な結果として定義されます。数学的な結果を結果の型で表すことができる場合 (この場合)、オーバーフローはありません。y
x
int
コンパイラは、式を好きなように自由に変換できます。
x - y
に
x + (-y)
ただし、元の動作が明確に定義されている場合に、変換が同じ動作を維持する場合に限ります。の場合、y == INT_MIN
評価の未定義の動作が同じ最終結果をもたらす限り、変換を実行できます-INT_MIN
(通常はそうなります)。
タイトルの質問に答えるには:
INT_MIN は、未定義の動作と見なされる整数から減算されますか?
INT_MIN - INT_MIN == 0
、オーバーフローできません。
int
ちなみに、 「整数」というよりも意味があると思います。int
数ある整数型の 1 つにすぎません。