Java intとは何ですか

silencement
silencementオリジナル
2019-05-30 09:20:106843ブラウズ

Java intとは何ですか

Java では、int は 32 ビット、long は 64 ビットで表現されます。これら 2 つの基本的な型は整数であり、他の表現方法はありません。彼らは自分の内面をどのように表現しているのでしょうか? 2の補数コードで表されます。問題を解く際に Java のビット演算に遭遇することが多いため、Java のビット演算は int 型とlong 型にのみ使用できます。したがって、Java が内部的にバイナリによってどのように表現されるかを分析する理由があります。ここでは例として int のみを取り上げますが、long も同じです。

1. Java 内部では int

int の範囲は 32 ビットで表現され、最上位ビットが記号を表すため、実際に表現できる数値は31ビットです。 Java の int 型の値の範囲は -2^31~2^31-1 です。

なぜこのような範囲になっているのでしょうか?これにはバイナリ保存方法が関係します。

Java では、int を格納するために 2 の補数が使用されます。正の数の場合、その補数はそれ自体です。たとえば、4 ビットを例に挙げてみましょう。正の数 1 ~ 7 は、それぞれ 0001,0010 です。 。 。 , 0111、合計7つの数字、つまり2^3-1です。

0 の場合、問題が発生していることがわかります。 -0 または 0 のいずれも 0 です。 0 をどのように表現するか決めますか?補数コードの法則では、0 は 0 であるとみなされるため、0 は 0000 で表されます。

このとき、負の数を表現する必要があります。負の数の補数表現は、その絶対値の反転 (符号ビットとともに反転) に 1 を加えたものであると考えられます。たとえば、-5 の場合、絶対値は 5 であり、0101 と表現されます。反転すると 1010、プラス 1 を加えると 1011 となります。これは、-5 の補数表現です。

現時点では、1000 は -8 を表すために使用できるため、負の数値の範囲は -2^31 となり、これは int の値の範囲も説明します。 64 ビット長についても同様です。

2. Java のビット演算

Java のビット演算はどのように実行されるのでしょうか?シフト操作は、数値全体を左または右に移動することに注意してください。左にシフトすると、下位ビットは 0 で埋められます。右に移動すると、2 つの状況が考えられます。 0 と正の数の場合、上位ビットは 0 で埋められます。負の数の場合、上位ビットは 1 で埋められます。たとえば、-5 は 1011 で、右に 1 桁シフトすると 1101、つまり -3 になります。

ちょっとした操作もあります。ビット単位の演算の場合は、符号ビットも関与する必要があることに注意してください。

3. 右シフトと除算の関係

正の数 (もちろん 0 の場合も) の場合、右に 1 位置シフトすることは、 2 で割った結果ですが、正の数の場合です。負の数の場合はありません (正確には 2 -1 で割った結果)。たとえば、-5/2 の場合は -2 になり、-5>>1 の場合は -3 になります。

4. 正負の符号と整数の除算・剰余演算の関係

正の数/正の数は切り捨て

負の数/負の数は絶対値を除算することに等しい

正/負の数および負/正の数は、絶対値に負の符号を掛けて除算することに等しい。

% の結果については、結果の絶対値は絶対値の法と同じですが、符号は最初の数値によって決まります。

5. なぜ補完コードを使用するのでしょうか?

(1) 前述したように、0 と -0 を合理的に表現するには;

(2) 負の数を負の数でもう 1 つ表現できます;

(3) 補数コードを使用することで、符号ビットとその他のビットを一律に処理できると同時に、減算も加算として処理できます。また、2の補数で表現された2つの数値を加算する際、最上位ビット(符号ビット)に桁上げがあった場合、その桁上げは破棄されます。

実は、大きな理由は足し算や引き算の計算を容易にするためです。演算に 2 の補数系を使用する場合、符号ビットを加算して演算できます。ビット演算では、符号ビットにキャリーがある場合、ビット範囲を超えているため破棄できます。正の数とその加算については特別なことは何もありません。以下の例はすべて 8 ビットです。たとえば、7 7 (00000111 00000111) の場合、結果は 00001110 (14) になります。

引き算の場合、たとえば 9-4 は 9 (-4) であると考えます。まず、00000100 である 4 を反転し、1 を加算して -4 の補数を取得します。これは 11111100 を表します。つまり、

00001001(9)

11111100(-4)

? 100000101

最後の符号のキャリーbit は 1 です。ビット範囲を超えているため、直接破棄して、直接 5 を取得します。つまり、これは引き算が足し算に変わることの実現です。

以上がJava intとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。