2017-03-05 38 views
2

我看到,下面的代碼:二進制加法執行類型邊界檢查而速記和增量不

byte b = 127; 
b = b + 1; 
b = b + 1; 
System.out.println(b); 

導致邊界運行時間期間檢查,並且所述第一加法取B OUT的範圍,導致以下錯誤 -

Main.java:11: error: incompatible types: possible lossy conversion from int to byte b=b+1; Main.java:12: error: incompatible types: possible lossy conversion from int to byte b=b+1;

然而,當我使用簡寫或增量,如:

我們發現字節的值'包繞',給出輸出

-127

爲什麼這個異常?究竟是什麼阻止了加法(如C所做的那樣),還是通過邊界檢查來增加/縮短?

回答

3

Why this anomaly?

當你添加一個byte加上一個int你會得到一個int所以當你把它分配給byte它抱怨。但是當你做

b += 1; 

有一個在這個操作是不是很明顯,但在JLS隱式轉換。更明確的例子是

char ch = '0'; 
ch /= 0.9; // << an implicit cast occurs here. 
System.out.println(ch); // 5 

同樣,當你做

b++; 

這個編譯,它必須承擔溢出是可能的。

總之,不同的是,

b = b + 1; 

有兩個運營商,而不是一個,而這導致可能發生溢出的警告。

注:這並不適用於intlong類型,你可以做

int i = Integer.MAX_VALUE; 
i = i + 1; // no warning as int is not widened to long 
long l = Long.MAX_VALUE; 
l = l + 1; // no warning as long is the widest type. 

即使Java的10可能有Long2爲128位整數(和它可能)long仍然不會被擴大。

+0

非常感謝,當做 'short x = 10; x = x * 5;' 我得到類似的錯誤 - **可能有損耗從短到int **轉換。 10 * 5 = 50,落在短的範圍內。爲什麼會引發編譯時錯誤?是否因爲編譯器自動將整個rValue轉換爲int? – Sriram

+0

@Sriram編譯器不知道你知道什麼。使'short'或'byte'成爲'final'變量,編譯器可以計算出不需要的警告。 –

-2

對於字節最小值爲-128(-2^7)最大值爲127因而如果大於轉換爲int

byte b = (int) b + 1 

因此不能轉換大INT爲字節