鑑於該字節,short和int是有符號的,爲什麼Java中的byte和short沒有得到通常的signed two's complement處理?例如0xff對於字節是非法的。是字節未簽名的二進制補碼嗎?
這已經在here之前討論過,但我找不到爲什麼會出現這種情況的原因。
鑑於該字節,short和int是有符號的,爲什麼Java中的byte和short沒有得到通常的signed two's complement處理?例如0xff對於字節是非法的。是字節未簽名的二進制補碼嗎?
這已經在here之前討論過,但我找不到爲什麼會出現這種情況的原因。
如果你看看用於在有符號字節中存儲-1
的實際內存,那麼你會看到它是0xff
。但是,在語言本身中,而不是二進制表示,0xff
超出了一個字節的範圍。 -1
的二進制表示確實會使用二進制補碼,但是屏蔽了該實現細節。
語言設計者簡單地採取了試圖在只能保存-128到127的數據類型中存儲255的立場應該被視爲錯誤。
您在留言問爲什麼Java允許:
int i = 0xffffffff;
字面0xffffffff
是int
文字並用2的補解釋。對於一個字節你不能做任何類似的事情的原因是該語言沒有提供用於指定文字類型爲byte
或者確實short
的語法。
我不知道爲什麼決定不提供更多的文字類型。我期望這是出於簡單的原因。該語言的目標之一是避免不必要的複雜性。
它是合法的,但你需要將它強制轉換爲字節,即(字節)0xff,因爲它超出範圍。
爲byte
範圍從-128到127
可能的值將有可能讓範圍之外的值賦給變量,默默扔掉溢出,但寧願被迷惑比conventient。
那麼我們將有:
byte b = 128;
if (b < 0) {
// yes, the value magically changed from 128 to -128...
}
在大多數情況下,最好是讓編譯器告訴你,這個值的範圍之外,而不是「修理」它這樣。
你可以寫
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.
謝謝。我最近開始意識到+ =中的隱式投射。在Java中,我同意0xff是int。就是這樣。但是通常0xff是8位的,因此應該可以分配給字節。無論如何,我認爲這個問題是答案 - 字節實現爲二補。 – Sridhar
缺少的是缺少字節文字類型,所以0xFF只能達到255.沒有辦法編寫0xFF,這是沒有強制轉換的字節。 C.F. '0xFFL'是一個'長' –
你是對的。但是你可以編寫它。 I.E.字節b =(字節)0xFF;當然,它失敗爲-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
謝謝高手知道實施是二補的。那麼爲什麼該語言允許int的0xffff_ffff? – Sridhar