2

据我所知,当使用 2 的补码时,第一个数字是 1,然后翻转数字并找到新字节的值并将其设为负数。javadoc 说 Integer.parseInt(String s, radix ) 和 Integer.valueOf(String s, radix) 都应该返回一个有符号整数对象,但是当我用这个测试它时:

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方法,如果你输入一个字节(和radix = 2),那么该方法将返回一个正确签名的值?

4

5 回答 5

7

如果它总是一个字节,那么这应该可以解决问题:

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

整数值为 129,但当您将其转换为字节时,它将变为 -127。

于 2013-03-14T17:02:05.643 回答
2

所以你要

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

您始终可以将字符串解析为 32 位整数,然后如果值为 128-255,请手动将其转换为负补码。

于 2013-03-14T16:57:56.877 回答
1

Integer.parseInt(String s,int radix)

将字符串参数解析为第二个参数指定的基数中的有符号整数。字符串中的字符必须都是指定基数的数字(由 Character.digit(char, int) 是否返回非负值决定),除了第一个字符可能是 ASCII 减号 '-' ('\u002D ') 表示负值。返回结果整数值。

所以 Integer.parseInt("anyvalue", 2) 永远不会返回 -some 值,除非第一个字符不是'-'。

于 2013-03-14T16:56:55.883 回答
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

于 2013-08-29T11:01:40.233 回答
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);
} 
于 2014-11-27T17:28:05.817 回答