2011-12-04 4 views
1

私は32ビットと64ビットを調べていました。 32ビットに格納できる整数値の範囲は±4,294,967,295ですが、Java intも32ビット(私が間違っていない場合)で、最大値は±2 147 483 648です。 longの場合と同じことですが、0 to ±2^63の値を格納しますが、64ビットの値は±2^64の値を格納します。どのようにこれらの価値が異なるのでしょうか?Java整数の整数が32ビットまたは64ビットをすべて使用しないのはなぜですか?

+0

と呼ばれます。署名されたJavaのプリミティブを使用して、符号なしの値を格納できます。 Javaはこれをサポートしていませんが、ほんのわずかな回避策ではうまく動作します。明らかに、符号なしの型をサポートする言語では、そのような回避策は必要ありません。 –

+0

2^64の負の値と2^64の正の値を格納するには、2 * 2^64または2^65または65ビットを格納するものが必要です。 2^63負または負以外の値を格納するには、2 * 2^63または64ビットが必要です。 –

答えて

5

Javaの整数はであり、という符号が付いています。したがって、そのビットが正か負かを示すために予約されています。 1

と対応する最小の負の値である - 表現がNビットで表される正の最大値を

( - 1)2 ^(N)によって与えられる、このアプローチでは"two's complement notation."呼ばれ(2 ^(N - - 1))

によって与え

正および負の境界に "オフ・バイ・ワン" の態様ゼロによるものです。ゼロはスロットを占有し、偶数の負の数と奇数の正の数を残します。表現された値を円のマークとして—のように時計の表面に表示すると、—は、ゼロが負の範囲よりも正の範囲に多く含まれることがわかります。言い換えると、正の並べ替えとしてゼロを数える場合は、正と負の値の範囲でより多くの対称性が見つかります。

この表現を学ぶには、小さくしてください。 、たとえば、3ビットを取ると表現することができるすべての数値書き出し:

  • -4
  • -3
  • を - 2
  • -1

これらの数値のそれぞれを定義する3ビットシーケンスを記述できますか?それを行う方法を理解したら、もう一度試してみてください。そこから、32ビットまたは64ビットまでの拡張方法を想像してください。

このシーケンスは「ホイール」を形成します。ここでは、それぞれが前のものに1を加えて形成され、3から-4までの回り込みがあります。そのラップアラウンド効果(減算でも起こりうる)は"modulo arithemetic."

+0

どうもありがとうございました。今、私は分かる :)。 –

+1

個人的には、私はいつもそれを単なる多項式b_ {n-1} * 2^{n-1} + b_ {n-2} * 2^{n-2} + .. + b_ { 0} * 2^0'であり、bは0または1であり、nはワード幅である。署名付きと署名なしの違いは、最初の用語が否定的であるかどうかだけです。 – Voo

+1

良い説明、@Voo。理解しやすいが形式的ではない定義では、上位ビットが1の場合、残りのビットの意味は変更されずに、8ビット数の場合は-128となります。これは '11111111'が-1である理由を説明しています。これは、 '01111111'、または127、プラス-128に相当します。繰り返しますが、あなたの定義と同じですが、*混乱する可能性は低いです。ちなみに、私はTeX表記に感謝します。 – seh

2

32ビットでは、2^32の値を格納できます。これらの値を0〜4294967295または-2147483648〜+ 2147483647と呼ぶのはあなた次第です。この違いは、「符号付きタイプ」対「符号なしタイプ」と呼ばれます。言語Javaは、intの署名タイプのみをサポートしています。他の言語では、符号なし32ビット型の型が異なります。

" - "部分にはもう1つのビットが必要なので、laguageは±4294967295の32ビットタイプを持ちます。

+0

ご注文を「すぐに使える」ようにするには、署名された範囲で行かなければなりません。 – yshavit

0

Java intが署名されているためです。署名用に1ビット必要です。

関連する問題