このセメスターは、システムのプリラムミングコースを受講しました。 なぜ50000 * 50000が負の値になるのですか? 私はこれの論理を理解しようとします。 は、ここではスライドのスクリーンショットは、なぜ2つの正の整数の積は負の整数ですか?
答えて
これは、ほとんどのプログラミング言語では、整数データ型のサイズが固定されているためです。
つまり、各整数値にはMIN値とMAX値が定義されています。 C#MAX INTで例えば
は2147483647で、MINはPHP 32ビットで-2147483648 あり、それはあなたがいることを乗り越えしようとすると起こる何9223372036854775807と-9223372036854775808
だPHP 64ビットでは2147483647と-2147483648 です値?単にコンピュータが整数オーバーフローと呼ばれるものを作成し、その値が最小値にループバックします。
つまり、C#2147483647 + 1 = -2147483648(longまたはfloatではない整数データ型を使用すると仮定します)。それはまさに50000 * 50000で起こることです。それは最大値を超え、次の値からループします。
正確な最小値と最大値は、使用される言語、コードが構築されるプラットフォーム、コードが実行されるプラットフォーム、および値の静的型によって異なります。
あなたのためにすべてをクリアすることを願っています!
32ビット符号付き整数は、数値の符号を示す番号とビット31としてのビット0-30を用いて格納されています。
これは、表現できる最大値が2,147,483,647であることを意味します(0から30までのすべてのビットが設定され、ビット31は正の数を示します)。
50,000と50,000の積がこの数より大きく、オーバーフローと呼ばれるものがあります。これは、データが予想された境界(下位31ビット)から符号ビットに「オーバーフロー」したことを意味します。
これで、ビット31が設定され、これが負の数であることが示されました。バイナリ表現から負の数を調べるには、1の補数(すべてのビットを反転)を取り、1を加えて、その前に負の符号を投げます。
は、あなたが32ビットの範囲に自分自身を制限する補数を取るとき...あなたは少し31
詳細については、signed number representationsをチェックよりも高いビットを含めてはならないように注意してください。
サンプルプログラム擬似コード
Print --> ("Size of int: " + (Integer.SIZE/8) + " bytes.");
int a=50000;
int b=50000;
Print --> (" Product of a and b " + a*b);
Output :
Size of int: 4 bytes.
Product of a and b:-1794967296
分析: 4バイト= 4×8 = 32ビットの。
符号付き整数は負の値を保持できるため、符号( - または+)に1ビットが使用されるため、数値範囲= 31のビットが使用できます。 番号範囲= - (2^31)、0(2^31-1) [つの正の数が0のために犠牲にされている]
-2147483648、= 2147483647 0 2147483647
最大可能正INT 50000 * 50000 =25億 実際の製品(SO 40000 * 40000が微細で、16億より大きい)(2147483647より大きい)
実際多くのポータブルCプログラムで符号付き整数オーバーフローを確実に2の補数演算を使用してラップアラウンドと仮定する。 しかし、Cの標準では、プログラムの動作はオーバーフローでは定義されていないとされており、Cプログラムはいくつかの最新の実装では動作しません。 http://www.gnu.org/software/autoconf/manual/autoconf-2.62/html_node/Integer-Overflow.html
- 1. JavaScriptの整数でない整数への負の数
- 2. 正の整数と負の整数を含むベクトルで最低の欠損整数を見つける?
- 3. 負の整数を持つNSStringを負の整数に変換する方法
- 4. 整数の積分
- 5. なぜ `のstd :: is_constructible_v <INT [2]、整数、整数> == false`の
- 6. なぜApplication.get_Caller(Type.Missing)は負の整数を返しますか?
- 7. 2つの整数を比較する:なぜ==真ですか?
- 8. 2つの32ビット整数を64ビット整数に結合するのはなぜですか?
- 9. 負の整数のビットシフト?
- 10. ハスケルの負の整数?
- 11. 1つのJavaメソッドで負の整数と正の整数の積を求めます。回答は印刷されています0
- 12. C++で整数のベクトルを整数の2次元ベクトルにプッシュできないのはなぜですか?
- 13. なぜ私の長い整数オーバーフロー/整数除算で負になっていますか?
- 14. 逆負の整数と0
- 15. なぜArray.Lengthは整数ではなく、整数ではない
- 16. 負の整数のJsonConvert.DeserializeObjectがゼロです。
- 17. 16進数への負の整数
- 18. 不正な整数値の整列
- 19. 正と負の整数を交互に持つ最長スライス
- 20. 大きな負の整数リテラル
- 21. Java、2つの整数を長い結果に結合する負の数
- 22. 負の整数でソートをソートする
- 23. MARIE ASM Lang - 整数除算(正/負)
- 24. Prologプログラムは、2つの整数の正方形の合計として(整数)の数を取得しますが、なぜ機能しませんか?
- 25. Python:文字列から正と負の整数をフィルタリングする
- 26. 2つの整数のIDからの固有の整数IDの生成
- 27. 2つの整数をTSQL文の別の整数に追加するには?
- 28. Phoenixが負の整数値を正しく表示しない
- 29. 整数リテラルのマクロが整数変数で動作しないのはなぜですか?
- 30. 2桁の整数を1つの整数で加算するVB.net
例2では0が得られます。理由は3.14と非常に少量です。 –
あなたは新しい質問に投稿する必要がありますが、簡単な言葉で答えるには、浮動小数点数は常に数値の最も重要な部分を格納します(浮動小数点の理由です)。したがって、1e20-1e20 = 0および0 + 3.14 = 3.14。一方、-1e20 + 3.14 = 1e20(原因3.14は十分ではない)、結果は0.0 – Atrakeur