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
Javaがバイトデータ型をサポートしている場合、バイトの操作がintになる理由
これがJava仮想マシンの設計方法です。バイトタイプで操作を実行するための命令セットはありません。むしろ、int
タイプの命令セットは、boolean
、byte
、char
での操作に使用されます。 、およびshort
タイプ。
から JVM仕様-セクション2.11.1 :
コンパイラは、Java仮想マシン命令を使用して、タイプ
byte
およびshort
のリテラル値のロードをエンコードします。これらの値は、コンパイル時または実行時にタイプint
の値に符号拡張されます。リテラル値のロードタイプboolean
およびchar
は、コンパイル時または実行時にリテラルをタイプint
の値にゼロ拡張する命令を使用してエンコードされます。[..]。したがって、実際のタイプboolean
、byte
、char
の値に対するほとんどの操作はおよびshort
は、計算タイプint
の値を操作する命令によって正しく実行されます。
この背後にある理由は、そのセクションでも指定されています。
Java仮想マシン1バイトのオペコードサイズ)を考えると、タイプをオペコードにエンコードすると、その命令の設計に圧力がかかります。型指定された各命令がすべてのJava仮想マシンのランタイムデータタイプをサポートしている場合、
byte
で表すことができるよりも多くの命令があります。[...]個別の命令は必要に応じて、サポートされていないデータタイプとサポートされているデータタイプの間で変換するために使用されます。
さまざまなタイプで使用できるすべての命令セットの詳細については、そのセクションの表を参照してください。
実際のタイプからJVM計算タイプへのマッピングを指定するテーブルもあります。
コンパイラは正しいことをしています。 (a + b)は、バイト変数に保持できる最大値を超える可能性があるためです。コンパイラにa、bの値は、「final」キーワードを使用しても変更されないので、文句を言うことはありません。
final byte a = 1;
final byte b = 1;
byte c = a + b;
JLS 5.6.2:2進数プロモーション カバー:
拡大プリミティブ変換(§5.1.2)は、次のルールで指定されているように、一方または両方のオペランドを変換するために適用されます。
いずれかのオペランドの型が
double
の場合、もう一方はdouble
に変換されます。それ以外の場合、いずれかのオペランドのタイプが
float
の場合、もう一方はfloat
に変換されます。それ以外の場合、いずれかのオペランドのタイプが
long
の場合、もう一方はlong
に変換されます。それ以外の場合、両方のオペランドはタイプ
int
に変換されます。
コンパイラは正しいです。変数をfinalに宣言するか、バイトにキャストします。
byte b = 1;
byte c = 22;
byte a = (byte) (b + c);
Java:バイト+バイト= int
:)
任意のオペランドで算術演算を実行している間、結果は次の形式で格納されます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からバイトへの不可逆変換の可能性
はい、それは言語仕様です。
加算(+)演算子。追加中、'a'
はint
タイプに変換(暗黙的にキャスト)され、bもタイプint
に変換されます。したがって、result
は暗黙的にタイプint
です。
-
演算子についても同じです。