簡體   English   中英

"由於java語言規則或jvm,添加字節轉換為int?"

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

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

如果 java 支持 byte 數據類型,那么為什么對 byte 的操作會導致 int

因為這就是 Java 虛擬機的設計方式。 沒有指令集可以對字節類型執行操作。 而是int類型的指令集用於對booleanbytecharshort類型的操作。

來自JVM 規范 - 第 2.11.1 節

編譯器使用 Java 虛擬機指令對byteshort類型的字面值負載進行編碼,這些指令在編譯時或運行時將這些值符號擴展為int類型的值。 booleanchar類型的文字值的加載使用在編譯時或運行時將文字零擴展為int類型的值的指令進行編碼。 [..]。 因此,對實際類型booleanbytecharshort的值的大多數操作都是由對計算類型int的值進行操作的指令正確執行的。

該部分還指定了這背后的原因:

鑒於 Java 虛擬機的一字節操作碼大小,將類型編碼為操作碼會給其指令集的設計帶來壓力。 如果每條類型化指令都支持 Java 虛擬機的所有運行時數據類型,那么指令的數量將超過一個byte所能表示的數量。 [...] 可以根據需要使用單獨的指令在不受支持和支持的數據類型之間進行轉換。

有關所有指令集可用於各種類型的詳細信息,您可以瀏覽該部分中的表格。

還有一個表指定實際類型到 JVM 計算類型的映射:

JLS 5.6.2: Binary Numeric Promotion涵蓋了它:

加寬原語轉換(第 5.1.2 節)適用於轉換以下規則指定的一個或兩個操作數:

  • 如果任一操作數的類型為double ,則另一個操作數將轉換為double

  • 否則,如果任一操作數的類型為float ,則另一個將轉換為float

  • 否則,如果任一操作數的類型為long ,則另一個將轉換為long

  • 否則,兩個操作數都轉換為int類型。

編譯器正在做正確的事情。 因為 (a + b) 可以超出可以保存在字節變量中的最大值。 如果你告訴編譯器 a、b 的值不會通過使用“final”關鍵字而改變,它就不會再抱怨了。

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

是的,這是語言規范。

加法(+)運算符。 添加時, 'a'轉換(隱式轉換)為int類型, b 也轉換為int類型。 因此result是隱式類型int

-運算符也一樣。

編譯器是對的,將變量聲明為final或強制轉換為字節:

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

JAVA:字節+字節=整數

:)

在對任何操作數進行算術運算時,結果以這種形式存儲MAX(int,operand1 type,operand2 type,...operandN type)例如: byte a=10; byte b=20; byte c=a+b; byte a=10; byte b=20; byte c=a+b;

然后 a+b 的結果將以 MAX(int,operand1 type,operand2 type,...operandN type) 的形式存儲在這種情況下 MAX(int,byte,byte) 最大值是 int ,它是最大值,所以 c將具有 int 值,但 c 已被聲明為 byte,我們不能將 int(較大)值存儲到 byte(較小)中。 這同樣適用於每個算術運算符。

這就是為什么錯誤顯示錯誤:不兼容的類型:可能有損從int到 byte 的轉換

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM