2013-02-18 46 views
4

讓我們Byte.parseByte()作爲一個例子作爲包裝parseXXX()之一。包裝的parseXXX()爲符號二進制誤解

parseByte(String s, int radix)'s JavaDoc

將字符串參數如在由 第二參數指定的基數符號的字節。

但是,這不是真的如果radix = 2。換句話說,中-127二進制文字是10000000

byte b = (byte) 0b10000000; 

所以下面應該是真實的:

byte b = Byte.parseByte("10000000", 2); 

但不幸的是,它會拋出NumberFormatException,而是我有如下做到這一點:

byte b = Byte.parseByte("-111111", 2); 

其中parseByte()解析二進制字符串作爲一個符號 - 幅度(符號和幅度),瓦特在這裏它應該解析爲一個帶符號的二進制數(2的補碼,即MSB是符號位)。

我錯了嗎?

+0

研究:你看過源代碼嗎? – jlordo 2013-02-18 13:54:41

+0

@jlordo不,我還沒有。 – 2013-02-18 13:56:31

+0

這樣做,這就是我昨天在發佈[this]之前如何理解這整個問題(http://stackoverflow.com/questions/14926920/java-long-parse-binary-string/14927505#14927505)。 – jlordo 2013-02-18 13:58:15

回答

4

我錯了這件事嗎?

是的。 Javadoc沒有提到2的補充。事實上,它明確說明它如何識別負值(即前綴-,因此有效地是「人類可讀」的符號量級)。

想想另一種方式。如果parseByte將基數2解釋爲2的補碼,那麼您希望基數爲10(或者其他任何基數)做什麼?爲了一致性,它必須是10的補碼,這將是不方便的,我可以向你保證!

+0

+1他們可以爲'radix = 2'設置一個if語句。 – 2013-02-18 14:00:12

+0

我還會注意到JavaDoc使用術語_signed byte_來強調Java不知道無符號字節。 – jlordo 2013-02-18 14:00:45

+0

@ Eng.Fouad:他們可以,但那樣會(a)不一致,(b)沒有記錄;) – 2013-02-18 14:00:52

1

這是因爲對於parseByte「10000000」是一個正的值(128),其不適合字節值的範圍從-128到128。但是,我們可以用的BigInteger解析二的comlement二進制字符串表示:

byte b = new BigInteger("10000000", 2).byteValue() 

這給出了預期的-128結果

相關問題