2017-09-28 17 views

答えて

0

これは、ほとんどのプログラミング言語では、整数データ型のサイズが固定されているためです。

つまり、各整数値にはMIN値とMAX値が定義されています。 C#MAX INTで例えば

は2147483647で、MINはPHP 32ビットで-2147483648 あり、それはあなたがいることを乗り越えしようとすると起こる何9223372036854775807と-9223372036854775808

だPHP 64ビットでは2147483647と-2147483648 です値?単にコンピュータが整数オーバーフローと呼ばれるものを作成し、その値が最小値にループバックします。

つまり、C#2147483647 + 1 = -2147483648(longまたはfloatではない整数データ型を使用すると仮定します)。それはまさに50000 * 50000で起こることです。それは最大値を超え、次の値からループします。

正確な最小値と最大値は、使用される言語、コードが構築されるプラットフォーム、コードが実行されるプラットフォーム、および値の静的型によって異なります。

あなたのためにすべてをクリアすることを願っています!

+0

例2では0が得られます。理由は3.14と非常に少量です。 –

+0

あなたは新しい質問に投稿する必要がありますが、簡単な言葉で答えるには、浮動小数点数は常に数値の最も重要な部分を格納します(浮動小数点の理由です)。したがって、1e20-1e20 = 0および0 + 3.14 = 3.14。一方、-1e20 + 3.14 = 1e20(原因3.14は十分ではない)、結果は0.0 – Atrakeur

1

32ビット符号付き整数は、数値の符号を示す番号とビット31としてのビット0-30を用いて格納されています。

これは、表現できる最大値が2,147,483,647であることを意味します(0から30までのすべてのビットが設定され、ビット31は正の数を示します)。

50,000と50,000の積がこの数より大きく、オーバーフローと呼ばれるものがあります。これは、データが予想された境界(下位31ビット)から符号ビットに「オーバーフロー」したことを意味します。

これで、ビット31が設定され、これが負の数であることが示されました。バイナリ表現から負の数を調べるには、1の補数(すべてのビットを反転)を取り、1を加えて、その前に負の符号を投げます。

は、あなたが32ビットの範囲に自分自身を制限する補数を取るとき...あなたは少し31

詳細については、signed number representationsをチェックよりも高いビットを含めてはならないように注意してください。

1

サンプルプログラム擬似コード

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

関連する問題