[解決済み] 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ビット整数の例が成立することは保証されていません)。
まれではありますが、符号付き整数のオーバーフローが期待通りに折り返されない例をいくつか挙げておきます。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】Enterキーを押して続行する
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] なぜ (int)x ではなく static_cast<int>(x) を使うのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] なぜGCCでx86の整数オーバーフローは無限ループを引き起こすのですか?