私は32ビットと64ビットを調べていました。±4,294,967,295
32ビットに格納できる整数値の範囲はですが、Javaint
も32ビットであり(誤解しない限り)、最大。までの値を格納することに気付きました±2 147 483 648
。についても同じですが、64ビットlong
からの値を格納します。これらの値はどうして違うのですか?0 to ±2^63
±2^64
3 に答える
Javaの整数は符号付きであるため、数値が正か負かを表すために1ビットが予約されています。この表現は「2の補数表記」と呼ばれます。このアプローチでは、nビットで表される最大の正の値は次の式で与えられます。
(2 ^(n -1))-1
対応する最小の負の値は次の式で与えられます。
-(2 ^(n --1 ))
正と負の境界に対する「オフバイワン」の側面は、ゼロによるものです。ゼロはスロットを占有し、偶数の負の数と奇数の正の数を残します。表示された値を円のマークとして描くと(文字盤の時間のように)、ゼロは負の範囲よりも正の範囲に属していることがわかります。つまり、ゼロをある種の正として数えると、正の値と負の値の範囲でより対称性が高くなります。
この表現を学ぶために、小さく始めてください。たとえば、3ビットを取り、表現できるすべての数値を書き出します。
- 0
- 1
- 2
- 3
- -4
- -3
- -2
- -1
それらの数字のそれぞれを定義する3ビットのシーケンスを書くことができますか?その方法を理解したら、もう1つ試してみてください。そこから、32ビットまたは64ビットまで拡張する方法を想像します。
そのシーケンスは「ホイール」を形成し、それぞれが前に1つ追加することによって形成され、3から-4までのラップアラウンドが示されます。このラップアラウンド効果(減算でも発生する可能性があります)は、「モジュロ算術」と呼ばれます。
32ビットでは、2^32の値を格納できます。これらの値を0から4294967295または-2147483648から+2147483647と呼ぶかどうかは、あなた次第です。この違いは「符号付き型」と「符号なし型」と呼ばれます。言語Javaは、の符号付き型のみをサポートしますint
。他の言語では、符号なし32ビットタイプとは異なるタイプがあります。
「-」部分には別のビットが必要になるため、±4294967295の32ビットタイプの言語はありません。
これは、Javaint
が署名されているため、署名に1ビットが必要です。