バイトの追加は、Java言語の規則やJVMのためにintに変換されますか? -- java フィールド と type-conversion フィールド と byte フィールド と operation フィールド と type-promotion フィールド 関連 問題

Is addition of byte converts to int because of java language rules or because of jvm?












18
vote

問題

日本語
<事前> <コード> byte a = 1; byte b = 1; byte c = a + b;

スローズエラー:精度の損失

<事前> <コード> byte subt = a_s - a_b; ^ required: byte found: int

この現象はJVMまたはJava言語で定義されているものがあります。

編集: Java言語で定義されている場合は、JVMを念頭に置いて把握していますか?

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

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

Throws error: possible loss of precision

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

Is this behavior has something to do with jvm or its been defined in java language .

EDIT : And if it is defined in java language then does it because of keeping jvm in mind ?

Means if java supports byte datatype then why operation on byte results int

</div
              
   
   

回答リスト

24
 
vote
vote
ベストアンサー
 

Javaがバイトデータ型をサポートしている場合、なぜバイト結果を操作してくださいint

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

JVM Spec - セクション2.11.1 / a>:

コンパイラは、これらの値を型 short7の値の値に署名させるタイプ byte short のリテラル値の負荷を符号化します。 CODE>コンパイル時または実行時に。 99887668 およびのリテラル値のリテラル値の負荷は、COMPILE-TIMEのタイプの値にリテラルをゼロに拡張する命令を使用してエンコードされています。 9988777669 または実行時。 [..]。したがって、実際のタイプの値のほとんどの操作<コード> boolean1 、<コード>、<コード> 9988766613 、<コード>、および<コード> boolean4 は正しく命令によって正しく実行されます。計算タイプ<コード> short15 の値の操作方法。

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

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

すべての命令セットがさまざまなタイプで利用可能なものの詳細については、そのセクションのテーブルを通過できます。

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

 

if java supports byte datatype then why operation on byte results int

Because that's how the Java Virtual Machine is designed. There is no instruction set to perform operation on a byte type. Rather the instruction set for int type is used for the operation on boolean, byte, char, and short types.

From JVM Spec - Section 2.11.1:

A compiler encodes loads of literal values of types byte and short using Java Virtual Machine instructions that sign-extend those values to values of type int at compile-time or run-time. Loads of literal values of types boolean and char are encoded using instructions that zero-extend the literal to a value of type int at compile-time or run-time. [..]. Thus, most operations on values of actual types boolean, byte, char, and short are correctly performed by instructions operating on values of computational type int.

The reason behind this is also specified in that section:

Given the Java Virtual Machine's one-byte opcode size, encoding types into opcodes places pressure on the design of its instruction set. If each typed instruction supported all of the Java Virtual Machine's run-time data types, there would be more instructions than could be represented in a byte. [...] Separate instructions can be used to convert between unsupported and supported data types as necessary.

For the details on what all instruction sets are available for various types, you can go through the table in that section.

There is also a table specifying the mapping of actual type to the JVM computational type:

</div
 
 
         
         
12
 
vote

コンパイラは正しいことをしています。 (A + B)は、バイト変数に保持できる最大値を超えることができます。コンパイラAに指示した場合、B値は「FINAL」キーワードを使用してもはやコンパレートに変わって変更しません。

<事前> <コード> boolean7
 

The compiler is doing the right thing. Because (a + b) can go beyond the maximum value that can be kept in a byte variable. If you tell the compiler a, b values don't change by using the 'final' keyword it wont complain anymore.

final byte a = 1; final byte b = 1; byte c = a + b; 
</div
 
 
   
   
12
 
vote

JLS 5.6.2 :バイナリ数値昇進をカバーする:

プリミティブ変換(§5.1.2)は、次の規則で指定されているオペランドのどちらかまたは両方のオペランドを変換するために適用されます。

  • どちらかのオペランドが boolean8 のどちらかである場合、もう1つは<コード> boolean9 に変換されます。

  • それ以外の場合、どちらかのオペランドが byte0 のいずれかの場合、もう1つは<コード> byte1 に変換されます。

  • それ以外の場合は、 byte2 のどちらかである場合、もう1つは byte3 に変換されます。

  • それ以外の場合、両方のオペランドは<コード> byte4 に変換されます。

 

JLS 5.6.2: Binary Numeric Promotion covers it:

Widening primitive conversion (§5.1.2) is applied to convert either or both operands as specified by the following rules:

  • If either operand is of type double, the other is converted to double.

  • Otherwise, if either operand is of type float, the other is converted to float.

  • Otherwise, if either operand is of type long, the other is converted to long.

  • Otherwise, both operands are converted to type int.

</div
 
 
0
 
vote

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

加算(+)演算子。 'a' は、 int typeに変換(暗黙的にキャスト)する間に変換されます。 int を入力することもあります。 result は暗黙的に型 int です。

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

Yes,It's language spec.

The addition(+) operator. while the adding, 'a' is converts(implicitly casts) to int type, b as well to type int. Hence result is implicitly of type int.

Same for - operator too.

</div
 
 
0
 
vote

コンパイラが正しい、変数を最後に宣言またはバイトにキャスト:

<事前> <コード> byte b = 1; byte c = 22; byte a = (byte) (b + c);

java:byte + byte = int

:)

 

Compiler is right, declare variables to final or cast to byte:

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

JAVA : byte+byte = int

:)

</div
 
 
 
 
-1
 
vote

オペランドに対して算術演算を行っている間、結果はこの形式で保存されています max(int、operand1型、operand2型、... operandn型) 元: <コード> byte a=10; byte b=20; byte c=a+b;

A + Bの結果は、MAX(int、operand1型、operand2型、... operandn型)の形式で格納されます。 この場合 max(int、byte、byte)最大値はintです。これは最大値であるので、cはint値を持ちますが、cはバイトとして宣言されており、INT(より大きな)値をバイト(小さい)に保存することはできません。算術演算子ごとにも同じことが適用されます。

それがエラーが言う理由です エラー:互換性のないタイプ: int からバイトへの損失変換

 

While doing the arithmetic operations on any operands the result is stored in this form MAX(int,operand1 type,operand2 type,...operandN type) Ex: byte a=10; byte b=20; byte c=a+b;

then result of a+b will be stored in the form of MAX(int,operand1 type,operand2 type,...operandN type) in this case MAX(int,byte,byte) the max value is int which is maximum so c will have the int value but c has been declared as byte, and we can't store int(bigger) value into byte(smaller). the same applies for every arithmetic operator.

that is why the error says error: incompatible types: possible lossy conversion from int to byte

</div
 
 

関連する質問

15  サイズを取得するための標準的な方法(昇格(x))[重複]  ( The standard way to get sizeofpromotedx ) 
この質問はすでにここで回答を持っています デフォルトの引数プロモーションを入手するためのタイプの特性 (3回答) ...

4  NULL値非NULL値リテラルを割り当てる場合のNULL安全型プロモーション  ( Null safety type promotion when assigning non null value literal ) 
nullsafety.dartpad.dev 次のコードを書く場合: <コード> void main() { String? name = 'Bob'; print(name.length); } 次のコンパイル時エラーを取得します。 値を...

0  私はまだcに新しいCと私のフロートの結果がランダムな理由を持っていません(多分プロモーションルール?)[重複]  ( Im still new to c and i dont have a clue why my float result is random maybe t ) 
この質問はすでにここで回答を持っています C の暗黙的関数宣言 (6回答) 警告:関数の暗黙の宣言 ...

2  int型の署名が一致しない場合のG ++エラーメッセージ  ( G error message when signedness of int type doesnt match ) 
サンプルプログラムから始めたばかりの場合、これは最も簡単です。 (注:私の質問はこのプログラムの修復方法についてではありません。あなたの答えがこのプログラムの修復方法だけで、私の質問についてのものではない場合は返信しないでください。) <事前> <コード> ...

1  ネストしたベクトルは昇進規則に従わない。解決策にバグがあります。  ( Nested vectors do not follow promotion rules solution has a bug ) 
このプログラムはネストされたベクトルを追加しますが、タイプは正しく宣伝されません。基本的なタイプのプロモーションルールに応じて、STD :: PlusはT1またはT2で取る必要があると思います。元の問題はこの投稿にあります( DECTYPEは入れ子のベクトルを...

1  フロートのバイナリ数値プロモーション  ( Binary numeric promotion for floats ) 
5.6.2のJLSの。バイナリ数値Promotion: オペレータが一対のオペランドへのバイナリ数値プロモーションを適用すると、数値型に変換可能な値を表す必要があります。の順に、次の規則が適用されます。 オペランドが参照タイプの場合は、箱入り変換(§5.1....

2  どのようにしてCHARをintと比較することができますか? [複製]  ( How come i can compare a char with an int ) 
この質問はすでにここで回答を持っています 暗黙的なプロモーションルール (2回答) 閉じられた 3年前>。 ...

0  括弧内のサブ式のタイププロモーションルールは何ですか?  ( What is the type promotion rule for a parenthesized sub expression ) 
複数の符号なし積分型<コード> CAT_Empleados3 および<コード> CAT_Empleados4 からなる整数式を想定しています。式には括弧内の副式が含まれており、その中にすべての要素は CAT_Empleados5 の型です。 括弧内の要素は、副...

1  プロモーションのためにタイプの形質を作ることができますか?  ( Can a type trait be made for promotions ) 
プロモーションが起こったとき、そしてそれが何であるかを知る必要があります。私の推測はです <事前> <コード> template <typename T> struct promoted { using type = std::common_type_t<T,...

18  バイトの追加は、Java言語の規則やJVMのためにintに変換されますか?  ( Is addition of byte converts to int because of java language rules or because of ) 
<事前> <コード> byte a = 1; byte b = 1; byte c = a + b; スローズエラー:精度の損失 <事前> <コード> byte subt = a_s - a_b; ^ required:...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有