第12章整数演算

12.1補数算術
Java仮想マシンは、すべての整数型が-byteサポート短く、int型、および長い、彼らは2の補数コードシンボルです。補数説明した実施形態は、正の整数のいずれかであることができ、負の整数を記述することが可能です。2の補数では、最上位ビットは、符号ビットです。符号ビットが1であり、負の整数を表し;符号ビットは、正の整数0であり、番号0を表します。

2倍ビットのパワーの合計数:数の範囲は、2の補数スキームで表すことができます。例えば、Javaでは、短いタイプは補数が符号付き16ビット整数を補完しています。216または65536:のみ整数で表すことができます。0の短い半減値範囲を入力して正の整数を表すために使用され、そして他の半分は負の数を表すために使用されます。範囲16ビットの補数負である-32768(0x8000の)〜-1(Oxffff )、 1(0x0001に)-32 767(0x7FFFの範囲の整数を表現する0000小口 )。
直感的には正の整数は2つの表現の数のひとつです。電源-負と負の2を添加することによって誘導することができます。例えば、16ビット長の短いタイプは、そう補数表現補数を得ることができる(-32768--1)有効範囲および16(または65536)の負のパワーを追加することにより、2の負の。-1 2の補数表現は、65536 +(-1)または65 535(Oxffff)です。-2 2の補数表現は、65536 +(-2)または65 534(Oxfffe)です。

加算演算は、シンボルの補数の符号付きバイナリ数に行われ、符号なし2進数として上で実行加えます。2つの数値(オーバーフローを無視する)は、結果が符号付きの2の補数として解釈されます。このプロセスは、このような状況の有効範囲内にある計算結果で行われます。例えば、限り0x00000004にOxfffffffe追加として結果4+(-2)を得、そしてします。結果Ox100000002として、のみ32ビットのint型ため、その後オーバーフロー部分が省略され、結果は0x00000002です。

Java仮想マシンは、算術オーバーフロー例外をスローをもたらさない整数で表示され、唯一の結果は、単純データ型と一致するように(またはINTを、または長く入力する)切り捨てられます。例えば、int型の値0x7FFFFFFFで1を加算し、0×80000000であろう。int型の付加価値ではなく、長い場合はそのため、Java仮想マシン2147483647 -2147483648を加算した結果だろう。Javaでプログラミングする場合、それは常に発生する可能性がオーバーフローに注意を払う必要があります。各ケースタイプ(intまたは長い)で選択されたデータを確認しなければならない正しいです。整数ははArithmeticExceptionあなたは常に念頭このような例外がスローされますに耐える必要がありますので、ときゼロによる除算例外がスローされます、必要なときに例外をキャッチする必要があります。

長い寸法が依然としてニーズを満たすことができない場合、Biglnteger持つjava.mathパッケージのクラスを使用することができる、このクラスのインスタンスは、任意の長さの整数を説明することができます。Biglntegerクラスは、これらの操作は、基本型とのjava.lang.MathパケットをサポートしているJava仮想マシンに基づいていることを条件として、任意の長さの整数で実行されたすべての数学演算をサポートしています

12.3演算コード
、Java仮想マシンは、算術演算、整数いくつかのオペレーティング・コードを提供し、それらは、ベースの操作の長いINTタイプを行います。上述したように、バイト、ショート、およびchar型演算値が参加する場合、それらは最初にint型に変換されます。演算コード、操作の同じタイプの対応する長いオペレーションコードを実行する各int型のため。

さらに、整数とlong intの型で実行することができます。表12-1は、次のタスクの操作コードについて説明します、スタックの上位2つの値をポップ検索に結果を追加します。値を持たなければならない圧力は、第1の命令スタック2人を追加しました。自身の操作コードによって指定された型の値は、最終的な結果は常に追加されたメンバーと同じタイプです。これらのオペコードは、任意の例外につながることはありませんオーバーフローがしばしば無視された場合、スローされます。

以前の私たちは、このようなルールを取得する:操作オペコードは、スタックから自分のオペランドを取りますが、表12-2に示す - 例外で、すなわちIINCオペレーションコードがint型のローカル変数に操作を加えます。直ちに命令IINC続く最初のバイトのバイトコードのストリームのためのローカル変数を追加して、値がIINC除去命令の第2バイトからローカル変数の後に追加されます。2番目のバイトは符号付きの2の補数の8ビットコードとして解釈されます。ローカル変数と8ビットの符号付きの値を加算し、加算結果をローカル変数に書き戻されます。このコードは、-128と127との間のローカル変数aの値を操作するために使用することができます。このコードは(または中)可変制御ループの減算演算と比べてより効率的に行われます。ADD命令と同じように、例外がスローされないがあり、オーバーフローは一般的に、わずかに無視されます。

表12-2の第2行は、命令IINC広い変数を記述する。10章で説明されているように、広い命令を使用して、8-16から符号なしのローカル変数インデックスを拡張することができます。16ビット命令は65,536場所変数にインデックスアドレスアップしてもよいです。命令の処理において、IINC、広い命令は、8-16から符号付き拡張の値をインクリメントするために使用されます。したがって、IINC広いオペコード変数は-32768-- 32,767の範囲内のローカル変数の値を変更してもよいです。

バイトコード方式のシーケンスが占JavaバイトコードのJavaソースコードブール型の構造を説明することを留意されたいです。位置2でのローカル変数に格納された値は、ソースコード内のブールfoundPrime変数を表し、それは- INT。個人またはINT命令0がtrueまたはfalseの定数に設定されている、それを押すことにより、ブール命令の値をチェックするためにint型の値0を比較することによって行わ。

 

おすすめ

転載: www.cnblogs.com/mongotea/p/11980070.html