web-dev-qa-db-ja.com

Java言語ルールのため、またはjvmのために、バイトの追加はintに変換されますか?

byte a = 1;
byte b = 1;
byte c = a + b;

エラーをスローします:精度が失われる可能性があります

byte subt = a_s - a_b;
                ^
  required: byte
  found:    int

この動作はjvmと関係がありますか、それともJava言語で定義されていますか。

EDIT:そしてそれがJava言語で定義されている場合、jvmを念頭に置いているのでそれを行いますか?

Javaがbyteデータ型をサポートしている場合はなぜoperation on byte結果int

14
Prateek

Javaがバイトデータ型をサポートしている場合、バイトの操作がintになる理由

これがJava仮想マシンの設計方法です。バイトタイプで操作を実行するための命令セットはありません。むしろ、intタイプの命令セットは、booleanbytecharでの操作に使用されます。 、およびshortタイプ。

から JVM仕様-セクション2.11.1

コンパイラは、Java仮想マシン命令を使用して、タイプbyteおよびshortのリテラル値のロードをエンコードします。これらの値は、コンパイル時または実行時にタイプintの値に符号拡張されます。リテラル値のロードタイプbooleanおよびcharは、コンパイル時または実行時にリテラルをタイプintの値にゼロ拡張する命令を使用してエンコードされます。[..]。したがって、実際のタイプbooleanbytecharの値に対するほとんどの操作はおよびshortは、計算タイプintの値を操作する命令によって正しく実行されます。

この背後にある理由は、そのセクションでも指定されています。

Java仮想マシン1バイトのオペコードサイズ)を考えると、タイプをオペコードにエンコードすると、その命令の設計に圧力がかかります。型指定された各命令がすべてのJava仮想マシンのランタイムデータタイプをサポートしている場合、byteで表すことができるよりも多くの命令があります。[...]個別の命令は必要に応じて、サポートされていないデータタイプとサポートされているデータタイプの間で変換するために使用されます。

さまざまなタイプで使用できるすべての命令セットの詳細については、そのセクションの表を参照してください。

実際のタイプからJVM計算タイプへのマッピングを指定するテーブルもあります。

18
Rohit Jain

コンパイラは正しいことをしています。 (a + b)は、バイト変数に保持できる最大値を超える可能性があるためです。コンパイラにa、bの値は、「final」キーワードを使用しても変更されないので、文句を言うことはありません。

final byte a = 1;
final byte b = 1;
byte c = a + b;
13
Dev Blanked

JLS 5.6.2:2進数プロモーション カバー:

拡大プリミティブ変換(§5.1.2)は、次のルールで指定されているように、一方または両方のオペランドを変換するために適用されます。

  • いずれかのオペランドの型がdoubleの場合、もう一方はdoubleに変換されます。

  • それ以外の場合、いずれかのオペランドのタイプがfloatの場合、もう一方はfloatに変換されます。

  • それ以外の場合、いずれかのオペランドのタイプがlongの場合、もう一方はlongに変換されます。

  • それ以外の場合、両方のオペランドはタイプintに変換されます。

9
Dukeling

コンパイラは正しいです。変数をfinalに宣言するか、バイトにキャストします。

byte b =  1;
byte c =  22;
byte a = (byte) (b + c);

Java:バイト+バイト= int

:)

0
Narpat Singh

任意のオペランドで算術演算を実行している間、結果は次の形式で格納されますMAX(int、operand1 type、operand2 type、... operatorN type)例:byte a=10; byte b=20; byte c=a+b;

この場合、a + bの結果はMAX(int、operand1 type、operand2 type、... operatorN type)の形式で格納されます。この場合、MAX(int、byte、byte)の最大値はintであり、cはint値を持ちますが、cはbyteとして宣言されており、int(bigger)値をbyte(smaller)に格納することはできません。同じことがすべての算術演算子に当てはまります。

そのため、エラーにはエラーが表示されます:互換性のないタイプ:intからバイトへの不可逆変換の可能性

0
Sushil Patel

はい、それは言語仕様です。

加算(+)演算子。追加中、'a'intタイプに変換(暗黙的にキャスト)され、bもタイプintに変換されます。したがって、resultは暗黙的にタイプintです。

-演算子についても同じです。

0
Suresh Atta