第11章型変換

11.1変換オペコード
Java仮想マシンは、操作コード変換作業の基本的な種類の数を含む、いかなるオペランドはスイッチング動作の動作コードをバックアップしない実行、変換された値を占の頂部から得られます。Java仮想マシンスタックのトップからポップ値、それを変換し、その後、変換結果スタックに。INTのために、長い、フロート及び表11-1に示すように、操作コードの二重型の間の変換は、四種類の間の可能な遷移の種類毎に、対応するオペレーションコードがあります。

表に示すように、11-2オペレーションコードがintデータ型に変換され、int型より少ないスペースを占有します。これらのオペコードからポップオペランドint型の値を見つけるされ、それが短い、int値のバイトに変換することができる、またはチャーは、次いで、int型の人のこの値は、スタック圧力を変換します。I2B命令は、その符号拡張は、int型を復元するために、int型の値の型、バイト切り捨てられポップ。I2Sポップ命令int型の値は、その符号拡張INTを復元するために、短いタイプを切り捨てられます。I2Cは、命令タイプチャーをポップのint型の値を切り捨てて、そのゼロ拡張INTに復元。

Java仮想マシンは、長い間、float型、double型の値を直接データ型には、オペコードint型より少ないスペースを占有していません。したがって、フロート型の値のバイトに2つのステップを必要とする:第一に、値がfloat型int型の値にF2Iコマンドを変換する必要があり、その後、得られた値は、int型の値I2Bバイト命令に変換します。

オペレーションコードがよりint値に変換することができるにもかかわらず、int型の値は、より少ないスペース・データ・タイプ(バイト、ショート、及びチャー)を占めるが、反対方向に行わないオペレーション・コード変換動作は存在しません。それのための圧入タイプの値の任意のバイト、ショート、及びチャーので、効果的にint型の値に変換されました。命令バイト、ショート、およびchar型またはヒープ内のオブジェクトの配列からの値を受け入れ、これらの値は、int型の値に変換するために検索コマンドに圧入されます。これらの命令は、第15章で説明します。

ショートバイトをに関し、char型は、最初の演算値がint型の最終結果を得るために、次いで、int型、整数型の値を算出するに変換されるであろう。バイト値の2種類が追加された場合従って、最終結果は、int型のタイプであろう。結果はバイトにする必要がある場合はバイト型への明示的なint型の結果でなければなりません。たとえば、次のコードは、コンパイラが失敗する:
//でのCD-ROMにオペコード/ EX1 / BadArithmetic.javaでファイルを
クラスBadArithmetic {

addOneAndOneバイト静的(){
バイト= A. 1;
バイト= B. 1;
バイトC = A + B;
戻りC;
}
}
操作がjavacのコンパイルとGoodArithmetic.classファイルを生成することができます。:このファイルは、次のaddOneAndOne()メソッドのバイトコード・シーケンスが含ま
0 iconst_1で//定数1プッシュINT
。:1 istore_0 // POP INTOローカル変数0は、AどちらがIS
。; // A =バイト1
2 // iconst_1での。再びプッシュINT 1の定数。
3 istore_1 // POP INTOローカル変数1、B IS:
//バイト= B. 1;
4 iload_0 //プッシュA(A IS AS ANが既にINTに格納
//ローカル
//変数0) 。
。// B 5 iload_1プッシュ(B IS AS ANはすでにint型に格納されている
//ローカル
//変数。1)
実行IADD //スタックは、ISの6 addition.Top
//ここで(A + B)、AN int型。
//(まだ結果バイトを7 I2bとに変換INTを結果
// 32ビットを占める)
。。れている、3~8 istore_2 //ポップINTOローカル変数
C =バイト(バイト)(A + B); //バイトC
9 iload_2。プッシュC //の値はSO ITができ
//返された。
10 ireturn //追加:リターン・C;
変換()メソッドは、int型の値を実証することは、Java仮想マシン・バイト型値方式に変換します。imInt変数の開始値125は、各サイクルの後、それを1つインクリメントし、バイト型にされるであろう。その後、元の値と-1の値の積になり、最後に再びバイト型に変換されます。このシミュレーションプロセスは迅速バイトの有効範囲の境界で何が起こるかを表示することができます。

127バイトタイプの最大値は、最小値は-128である。この範囲内のint型の値を直接バイト値、外この有効範囲のint型の値に変換され、物事は面白く。

Java仮想マシンが切り捨てられた方法によって拡張し、int値のバイト値に変換し署名しました。最上位ビット(「符号ビット」)長い、int型、短いとはバイトのint型の値のこのタイプは、正または負であることを指摘しました。符号ビットは、nの値は、0である場合、符号ビットが1である場合、それは負です。タイプは、7バイトが符号ビットであるビット。バイト値からの遷移にint型の値は、7の値は、31ビットを8にコピーされます。これは、int型の値を生成し、この値の元の値は、同じ値を有する得られたint型バイト結果値に変換されます。切り捨て操作とbyte型の有効な値を受け取ります符号拡張、int型の変数を実行した後。

アプレットリストは、int型の値型のバイトの有効範囲を超えてバイトを変換するときに何が起こったのかをシミュレートしました。例えば後、imlnt変数128(0x00000080)であり、それはバイトに変換され、バイト型の値は-128(Oxffffff8O)を得ました。次に、変数がimlntとき-129(Oxffffff7f)。これは、バイト型の値に変換した127(0x0000007f)を得ました。

 

おすすめ

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