【问题标题】:Java - Integer.parseInt() not returning a negative number when radix=2Java - 当基数 = 2 时,Integer.parseInt() 不返回负数
【发布时间】:2013-03-14 16:54:23
【问题描述】:

据我所知,当使用 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 方法,如果你输入一个字节(并且基数 = 2),那么该方法将返回一个正确签名的值?

【问题讨论】:

  • 可能是因为它返回的是 int 而不是 byte

标签: java binary parseint


【解决方案1】:

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

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

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

【讨论】:

  • NumberFormatException:值超出范围。值:"10000001" 基数:2
  • byte b = Byte.parseByte("10000001", 2); 有什么问题?
  • 据我所知,parseByte 方法仅适用于无符号字节,因此读取的数字为 129,大于一个字节可以容纳的值,因此会抛出 NumberFormatException。
  • 您的代码也将其读取为 129,但它适合一个字节。看起来 parseByte 期望在负数时使用“-”对数字进行严格的数学表示。符号位是计算机的东西。你的答案是正确的。无论如何,JVM 在内部将字节表示为整数。
【解决方案2】:

所以你想要

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

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

【讨论】:

  • 不,我正在寻找类似 Integer.parseInt("[8-bit number]",2) = 正确签名的数字
  • 看起来像是评论,而不是答案。
【解决方案3】:

Integer.parseInt(String s,int radix)

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

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

【讨论】:

  • 除非它们是你自己的话,否则你应该参考你找到它们的地方。
【解决方案4】:

这是因为 int 10000001 不是 -127,int 有 32 位,而这是第 31 位,它决定了数字是否为负。如果我们认为 10000001 是 -127 那么它是一个字节,而不是 int。但是 Byte.parseByte("10000001", 2) 无法解析二进制补码表示,会抛出 NumberFormatException。在 Java SE 中解析二进制补码表示的唯一方法是

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

这将产生预期的 -127

【讨论】:

    【解决方案5】:
    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);
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2013-02-19
      • 2023-04-10
      • 2021-12-31
      • 2012-01-15
      • 1970-01-01
      相关资源
      最近更新 更多