2012-05-03 55 views

回答

4

如果你看看用於在有符號字節中存儲-1的實際內存,那麼你會看到它是0xff。但是,在語言本身中,而不是二進制表示,0xff超出了一個字節的範圍。 -1的二進制表示確實會使用二進制補碼,但是屏蔽了該實現細節。

語言設計者簡單地採取了試圖在只能保存-128到127的數據類型中存儲255的立場應該被視爲錯誤。

您在留言問爲什麼Java允許:

int i = 0xffffffff; 

字面0xffffffffint文字並用2的補解釋。對於一個字節你不能做任何類似的事情的原因是該語言沒有提供用於指定文字類型爲byte或者確實short的語法。

我不知道爲什麼決定不提供更多的文字類型。我期望這是出於簡單的原因。該語言的目標之一是避免不必要的複雜性。

+0

謝謝高手知道實施是二補的。那麼爲什麼該語言允許int的0xffff_ffff? – Sridhar

1

它是合法的,但你需要將它強制轉換爲字節,即(字節)0xff,因爲它超出範圍。

0

byte範圍從-128到127

可能的值將有可能讓範圍之外的值賦給變量,默默扔掉溢出,但寧願被迷惑比conventient。

那麼我們將有:

byte b = 128; 
if (b < 0) { 
    // yes, the value magically changed from 128 to -128... 
} 

在大多數情況下,最好是讓編譯器告訴你,這個值的範圍之外,而不是「修理」它這樣。

4

你可以寫

int i = 0xFFFFFFFF; 

,但你不能寫

byte b = 0xFF; 

爲0xFF的是int值不是一個byte所以它等於255沒有辦法定義字節或短文字,所以你必須投它。

BTW你可以做

byte b = 0; 
b += 0xFF; 
b ^= 0xFF; 

即使

byte b = 30; 
b *= 1.75; // b = 52. 
+0

謝謝。我最近開始意識到+ =中的隱式投射。在Java中,我同意0xff是int。就是這樣。但是通常0xff是8位的,因此應該可以分配給字節。無論如何,我認爲這個問題是答案 - 字節實現爲二補。 – Sridhar

+0

缺少的是缺少字節文字類型,所以0xFF只能達到255.沒有辦法編寫0xFF,這是沒有強制轉換的字節。 C.F. '0xFFL'是一個'長' –

+0

你是對的。但是你可以編寫它。 I.E.字節b =(字節)0xFF;當然,它失敗爲-1,但:-) –

1

你可以從字面上設置一個字節,但奇怪的是,你必須使用更多的數字:

byte bad = 0xff; // doesn't work 
byte b = 0xffffffff; // fine 

的邏輯是,那0xff隱含地是0x000000ff,它超出了一個字節的範圍。 (255)

這不是你得到的第一個想法,但它有一些邏輯。數字越長,數字越小(絕對值越小)。

byte b = 0xffffffff; // -1 
byte c = 0xffffff81; // -127 
byte c = 0xffffff80; // -128