1. ホーム
  2. c++

[解決済み] int i=400*400/400 で結果が 72 になるのはなぜか、データ型が循環しているのか?

2022-03-06 22:10:47

質問

まず思うのは 400*400=160000 が変換され 28928 0から始まって 160000 int 型の場合、循環的に時間が経過します (例えば sizeof(int) = 2バイト)のように仮定します。

<イグ

そして 28928 で割り切れる。 400 となり、その床は 72 と、変数の種類によって結果が異なります。私の推測は正しいのでしょうか、それとも他に説明があるのでしょうか?

どのように解決するのですか?

という、恐ろしく古いコンパイラを使っていると仮定します。 int は16ビットしかありません。そうですね、あなたの分析は正しいです。

400 * 400 = 160000 

//  Integer overflow wrap-around.
160000 % 2^16 = 28928

//  Integer Division
28928 / 400 = 72 (rounded down)

もちろん,より大きなデータ型の場合は,このようなオーバーフローは起こらないので,次のような結果が得られます. 400 .

*このラップアラウンド動作は保証されています。 に対してのみ 無記名 整数型 . 符号付き整数の場合、技術的には 未定義の動作 CやC++では

多くの場合、符号付き整数は依然として同じ折り返し動作を示します。 ただ、それをあてにすることはできない。 (つまり、符号付き16ビット整数の例が成立することは保証されていません)。


まれではありますが、符号付き整数のオーバーフローが期待通りに折り返されない例をいくつか挙げておきます。