-1 × 10 ÷ 2
っていくらでしょう。
-5ですよね。
でも
出力結果:「2147483643」
になるんです。なんじゃこりゃ?
でも21億という数値はプログラマーならなじみのある数値。
符号ビットがおかしいのか、unsigned intと掛け算したから、unsignedに引っ張られたのかな。
なら、掛け算の時点で既におかしい値になってるはずだね。
出力結果:「-10」
エ・・。正しい・・。
何?掛け算が終わった時点では、signedなの?
signedをsignedで割って何故unsignedになる・・。
まぁ最後s2の計算をするとunsignedになっちゃうだろう。
掛け算に変えて試してみよう。きっと21変な数になるはずだ。
出力結果:「-20」
正しい・・。
意味わからん・・。
s2をマイナスにしたらどうなるんだ?
出力結果:「0」
な・・!
何故0・・・。
もう分けがわかりませんorz
VisualC++、Ubuntu gcc、ARMで起こりましたが、アセンブラの振る舞いは異なりそうでした。
未定義動作ですかね。
明日アセンブラコード読んでみますか・・。
誰か原因知ってたら教えて下さい・・。
↓まとめ
#include
int main(){
unsigned int u = 10;
int s1 = -1, s2 = 2;
printf("%d\n", s1 * u / s2 ); // = 2147483643
printf("%d\n", s1 * u ); // = -10
printf("%d\n", u / s2 ); // = 5
s2 = -2;
printf("%d\n", s1 * u / s2 ); // = 0
printf("%d\n", s1 * u ); // = -10
printf("%d\n", u / s2 ); // = 0
return 0;
}