【问题标题】:Integer.parseInt() doesn't parse large negative numbersInteger.parseInt() 不解析大的负数
【发布时间】:2022-02-01 15:04:13
【问题描述】:

为什么当我尝试Integer.parseInt("80000010", 16) 时会抛出 NumberFormatException??那IS是一个32位的数字,就是java的int大小。

编辑: 最好的部分是这个......

int z = 0x80000010;
System.err.println("equal to " + z);

根据我的计算器打印出-2147483632 确实是0x80000010 ;)

【问题讨论】:

  • 80000010 在我的世界中不是负数。
  • 您在标题中说“负数”,但示例是正数。
  • Java 不支持 unsigned int 有点“邪恶”
  • 缺少无符号很容易解决。但我同意你不应该这样做。 ;)

标签: java


【解决方案1】:

因为 parseInt “将字符串参数解析为有符号整数”,如 API 文档中所述。基数为 16 的值 80000010 超出了带符号的 32 字节值的有效范围。

【讨论】:

    【解决方案2】:

    你可以的

    int value = (int) Long.parseLong("80000010", 16)
    

    更新:

    使用Java 8 update (2014) 你可以写

    int value = Integer.parseUnsignedInt("80000010", 16);
    

    【讨论】:

      【解决方案3】:

      80,00,00,1016 = 2,147,483,66410

      虽然 Java 整数的范围是 -2,147,483,64810 到 2,147,483,64710

      【讨论】:

        【解决方案4】:

        对于那些坚持使用 Java Guava 提供了一个用于将 int 解析为的实用程序 无符号:

        UnsignedInts.parseUnsignedInt("ffffffff", 16);
        > -1
        

        【讨论】:

          【解决方案5】:

          你正在用基数 16 解析它。所以它大于整数的最大值。

          【讨论】:

            【解决方案6】:

            这是因为第一个参数是有符号整数,所以对于负数你必须明确给出减号。在您的情况下,您的 unsgined 数字超出了整数范围。

            【讨论】:

              【解决方案7】:

              Integer.parseInt() 将有符号整数作为输入。这意味着输入必须介于"7FFFFFFF""-80000000" 之间。注意0x80000000 之前的负号。 -2147483632 的输入是正面的2147483632 (0x7FFFFFF0),前面有一个负号,所以Integer.parseInt("-7FFFFFF0", 16)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-06-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-01-15
                • 1970-01-01
                • 2017-02-13
                • 2013-02-19
                相关资源
                最近更新 更多