オーバーフローがエラーを起こすので、一種swap_int()は書き込まれないのだろうか?

このように:

ボイド swap_int(INT *、INT * B){
     * A = * A * + B。
    * B = * A - * B。
    * A = * A - * B。
}

+ bはINT(符号付き)の範囲を表すことができる超えた場合、オーバーフロー、エラーは交換しないのだろうか?

VS2013 && MinGW.org GCC-6.3.0-1コンパイラのテスト:

場合= 0x7FFFFFFFで(INT_MAX)、B = 0x7FFFFFFE、合計がオーバーフローするが、結果が正しく表示。なぜ?

我々は0x7FFFFFFFで+ 1が、結果は-2147483648、すなわち負の最小値である試みる; +2は-2147483647得る。INT_MAX * 2利用できる-2; INT_MIN * 2 0すぎます。あなたは(少なくとも対にし、gccがこれです)法律を見つけることができます。

オーバーフローが発生した場合、その結果は以下の通り定期で表示されます。

 

即INX_MAX + 1 = INX_MIN、INT_MIN 1 = INT_MAX。

+ bはオーバーフローを生成する際に、B同時に意志[INT_MAX / 2、INT_MAX]同時に、または[INT_MIN、INT_MIN / 2]で、次に、参照する機能を前記スイッチング。

すなわち、a + bの値は= INT_MAX、B = 2、= A + B = INT_MIN + 1(離れ最も図左から下端)、B = AB = INT_MIN +た場合でもオーバーフローが、0を超えないで1 +( - b)は(すぐ図における最下端から)再び2つの負のオーバーフローを追加、INT_MAXを=、= AB = INT_MIN + 1 +( - INX_MAX)= 2。

したがって、場合でも、追加のオーバーフローの結果、交換の結果には影響しません。

 

おすすめ

転載: www.cnblogs.com/dabai56/p/10994770.html