2013-03-14 163 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); 
}