2013-10-17 25 views
4

來自oracle website的引用「字節:字節數據類型是一個8位帶符號的二進制補碼整數,其最小值爲-128,最大值爲127(含)。Java中的帶符號字節類型和位運算符?

這裏,前兩行是有效的,但最後還不是

  byte b = -128; 
     byte b1 = 127; 
     byte b2 = b>>>b1;//illegal 

Q1)什麼是8位究竟意味着簽署?二進制格式的128將是1000 0000,-128需要一個額外的負值符號位,如果所有8位都被佔用,那麼它將適合。 Q2)對於int,有一個無符號的右移運算符,但是這對於字節來說似乎是非法的,爲什麼會這樣。在字節的情況下可以防止溢出。在case of int, it works

感謝您的幫助

回答

5
  1. 只是這聽起來像:有8位,持有2^8 = 256個可能的值。它是有符號的,所以範圍是frmo -128到127(256值)。最重要的位的值爲-128。

  2. 在Java中,二進制數字提升與諸如b >>> b1之類的操作發生。這兩種類型都被提升爲int,結果是int。但是,您可以明確地將結果轉換回byte

這裏的演員:

byte b2 = (byte) (b >>> b1); 

JLS, Section 5.6.2,關於二進制數字促談:

加寬原語轉換(§5.1.2)應用於轉換一方或雙方 操作數由以下規則指定:

如果任一操作數的類型是dou ble,另一個轉換爲double。

否則,如果任一操作數的類型爲float,則另一個操作數將被轉換爲 以浮動。

否則,如果其中一個操作數的類型爲long,則另一個操作數將被轉換爲長整型 。

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

(重點煤礦)

+0

感謝,在8位而言,哪裏的牌子去了? '+'和'-'應該是8位的一部分嗎? – eagertoLearn

+0

將「byte」的值看作所有8位值的總和:-128,64,32,16,8,4,2和/或1. – rgettman

+0

這意味着一個8位表示1000 0000應該是-128?而不是128.? – eagertoLearn

相關問題