2013-05-27 72 views
7

由於SE 7 Java允許將值指定爲二進制文字。該文件告訴我'字節'是一種可以容納8位信息的類型,值爲-128到127.Java二進制文字 - 字節值-128

現在我不知道爲什麼,但我不能定義8位,但只有7,如果我試圖分配二進制文字在Java字節如下:

byte b = 0b000_0000; //solves to the value 0 
byte b1 = 0b000_0001; //solves to the value 1 
byte b3 = 0b000_0010; //solves to the value 2 
byte b4 = 0b000_0011; //solves to the value 3  

依此類推,直到我們獲得了最後幾possibilitys使用這7位:

byte b5 = 0b011_1111; //solves to the value 63 
byte b6 = 0b111_1111; //solves to the value 127 

如果我想使它負數我必須如此加入前導:

byte b7 = -0b111_1111; //solves to the value -127 

現在我遇到的一半問題是我只用7位來描述他們告訴我的是8位數據類型。下半部分是它們似乎不會被用作二進制補碼,除非使用32位int類型,我可以定義所有的32位(包括「符號指示符位」)。

現在,當我搜索如何顯示在範圍內的號碼-128有人告訴我這樣做沒有任何進一步解釋這樣的:

byte b8 = 0b1111_1111_1111_1111_1111_1111_1000_0000; 

我可以清楚地看到,在過去的8位(1000 0000)做代表三三兩兩-128 compelment使用8位,還是我從來沒有感到困惑更多,試着問我的問題:

  • 心不是上述32位長NR 32位(基於Java)int值?
  • 爲什麼我可以將32位值分配給8位(java-)字節類型?

或者一般情況下:爲什麼我必須這樣分配它?

任何有關此鏈接/信息將是偉大的! 感謝您提前閱讀本文以及提供更多信息。

問候 月

+0

確實'byte b8 = 0b1000_0000'工作,也查了2的補碼二進制表示 –

+0

沒有字節b8 = 0b1000_0000不能工作,不幸的是我失去了對這個問題的科學關注,但我認爲這樣可能不起作用。 然而有趣的是,從來沒有在這個問題上一個完整的答案,需要檢查如何設置就可以了獎勵。 – JBA

回答

8

根據Java規範,

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1

所有的聲明(B,B1,...,和B8)使用INT文字,甚至當他們適合一個字節。 Java中沒有字節字面值,只能使用int來初始化一個字節。

我做了一些測試,byte neg128 = -0b1000_0000;工作正常。 0b1000_0000是128,所以你只需要在它之前放一個-的標誌。請注意,1根本不是符號位(不要考慮8位字節,將32位整數轉換爲字節)。所以如果你想指定符號位,你需要寫所有的32位,正如你已經證明的那樣。

所以byte b8 = 0b1000_0000;是一個錯誤就像byte b8 = 128;是一個錯誤(+128不適合在一個字節)。您還可以強制轉換與轉換:

byte b = (byte) 0b1000_0000;byte b = (byte) 128;

演員告訴你知道128不適合在一個字節和位模式將被重新解釋爲-128編譯器。

+0

哦,我也有些吃驚,0b1000_0000在這種情況下不會自動進行符號擴展。 :-) – marcus