2013-03-14 68 views
2

據我所知,當使用2的補碼時,第一個數字是1,那麼你翻轉數字並找到新的值字節並使其成爲負數。javadoc說Integer.parseInt(String s,radix)和Integer.valueOf(String s,radix)都應該返回一個有符號整數對象,但是當我用這個測試它時:Java - Integer.parseInt()當radix = 2時不返回負數

System.out.println(Integer.parseInt("10000001", 2)); 

System.out.println(Integer.valueOf("10000001", 2)); 

我得到:

129 

129 

即使我的計算讓我-127。什麼有趣的是,

System.out.println(Integer.parseInt("-10000001", 2)); 

打印出:

-129 

任何人都知道不同的Java方法,如果你輸入一個字節(和基數= 2),則該方法會返回一個正確簽名的值?

+2

也許是因爲它返回的'byte'的'int'呢? – Mysticial 2013-03-14 16:56:56

回答

7

如果它始終將是一個字節,那麼這應該做的伎倆:

int i = Integer.parseInt("10000001", 2); 
byte b = (byte) i; 

整數值將是129,但是當你將它轉換爲一個字節將變爲-127。

+0

NumberFormatException:值超出範圍。值:「10000001」基數:2 – ZhongYu 2013-03-14 17:09:31

+0

我的不好。在編輯中修復。 – leedsunited92 2013-03-14 17:13:13

+0

謝謝。這就是訣竅! – YazanLpizra 2013-03-14 17:18:03

1

Integer.parseInt(String s,int radix)

將字符串參數作爲基數中的一個符號整數由第二個參數指定 。字符串中的字符必須全部爲指定基數的 數字(由 Character.digit(char,int)返回非負值決定),但第一個字符可能是ASCII減號' - '(不包括 )。 '\ u002D')至 表示負值。返回結果整數值。

所以Integer.parseInt(「anyvalue」,2)永遠不會返回一些值,除非第一個字符不是' - '。

+1

除非他們是你自己的話,否則你應該參考你找到他們的地方。 – 2013-03-14 16:59:07

2

所以,你要

Integer.parseInt("1", 2) == -1? 

你總是可以解析字符串作爲一個32位整數,那麼如果該值爲128-255,手動將其轉換成其消極的補充。

+0

不,像Integer.parseInt(「[8位數字]」,2)=正確簽名的數字 – YazanLpizra 2013-03-14 17:00:20

+1

看起來像一個評論,而不是一個答案。 – MrSmith42 2013-03-14 17:00:28

0

這是因爲對於int 10000001不是-127,int有32位,並且這是31位,它決定了數字是否爲負數。如果我們認爲10000001是-127那麼它是一個字節,而不是int。但Byte.parseByte(「10000001」,2)不能解析二進制補碼錶示,並會拋出NumberFormatException異常。解析在Java SE二進制補碼錶示的唯一方法是

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

這將產生預期的-127

0
public static void main(String[] args) { 
    int i = -4; 

    /* returns the string representation of the unsigned integer value 
    represented by the argument in binary (base 2) */ 

    String convertedString = Integer.toBinaryString(i); 

    System.out.println(convertedString); 

    /* Converting the binary format string back to integer value */ 
    int foo = new BigInteger(convertedString, 2).intValue(); 

    System.out.println(foo); 
}