7

intをunsignedintで除算しようとすると、予期しない結果が発生します。

int b;
unsigned int c;
int res;
float res_f;

b = -25;
c = 5;

res = b / c;   // res = 858993454
res_f = b / c; // res_f = -5.000000

同じことが「+」、「-」、「*」でも問題なく機能しますが、「/」では失敗します。ここで恋しいのは何ですか?

PS

さまざまなコンパイラでテストされ、結果は同じでした。

4

1 に答える 1

14

これが C または同様のもの (Objective C など) であると仮定すると、次のように変更します。

res = b / c;

に:

res = b / (int)c;

説明:混合式に対する C の型変換規則に従って、b が から に変換されintています。unsigned intその過程で から にオーバーフロー-250xFFFFFFE7 == 4294967271ます。次に、 のunsigned int結果が得られます4294967271 / 5U = 858993454U。これは暗黙的に に変換されますint(結果は符号付きと符号なしの 32 ビット整数の両方の範囲にあるため、このステップではオーバーフローはありません)。

ちなみに、結果は a (I get )floatの精度制限内で同じである必要があります。この場合、-5.0 が得られることに驚きました。float858993472.0

于 2011-03-16T16:25:42.243 に答える