以前に私は解決した何かを思いついたが、後で私が行っていたものの同様の例を見てみましょう:
int b = 35000000; //35million
int a = 30000000;
unsigned long n = ( 100 * a ) / b;
出力:4294967260
に変更a
しただけで、は符号付き32ビット整数であるunsigned long
ため、正しい85%の出力が表示されます。a
しかし、これは後で私を手に入れました。単に計算が行われているa
間は値の割り当てはなく、オーバーフローの代わりに30億という正しい値が表示されるはずです。( 100 * a )
実際に割り当てがなかったかどうかを理解するために、コードからa
削除a
し、代わりに手動で値を書き込みます。
int b = 35000000;
unsigned long n = ( 100 * 30000000 ) / b;
大きな驚きは、出力も4294967260であるということでした。
もちろん、30億の値をに割り当てることができますunsigned long
。それがオーバーフローの原因だと最初に思ったのです( 100 * 30000000 )
が、「何にオーバーフロー?オーバーフローするものは何もない」と聞いてみました。次にb
、unsigned longに変更しました。これは、最も驚くべきことに、出力が85%正しかったことです。
最初の例ではa
、unsigned long
int b = 35000000;
unsigned long a = 30000000;
unsigned long n = ( 100 * a ) / b;
そのままb
にしint
ておくと機能しますが、2番目の例では機能しません。何が起こっているのでしょうか。
これは、うまくいくものとうまくいかないものですべての例を書き直させてもらうには少し圧倒されるかもしれません。
動作(出力= 85):
int b = 35000000;
unsigned long a = 30000000;
unsigned long n = ( 100 * a ) / b;
動作(出力= 85):
unsigned long b= 35000000;
unsigned long n = ( 100 * 30000000 ) / b;
動作しない(オーバーフロー):
int b = 35000000;
int a = 30000000;
unsigned long n = ( 100 * a ) / b;
動作しない(オーバーフロー):
int b = 35000000;
unsigned long n = ( 100 * 30000000 ) / b;