解析16位短路时出错

时间:2018-03-04 02:16:29

标签: java parsing primitive short

  

short:短数据类型是16位带符号的二进制补码整数。它的最小值为-32,768,最大值为32,767(含)

为什么以下

System.out.println(Short.parseShort("1111111111111111", 2));

返回

java.lang.NumberFormatException: Value out of range.
  

如果发生以下任何一种情况,则抛出NumberFormatException类型的异常:

     
      
  • 第一个参数为null或者是长度为零的字符串。

  •   
  • 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX。

  •   
  • 字符串的任何字符都不是指定基数的数字,除了第一个字符可能是减号' - '('\ u002D')或加号'+'('\ u002B' )如果字符串长度超过长度1.

  •   
  • 字符串表示的值不是short类型的值。

  •   

我认为错误来自最后一颗子弹,但是 我认为当使用Short时,16'1'位相当于-1。那么它应该有效吗?

2 个答案:

答案 0 :(得分:3)

1111111111111111应转换为65535,其大于short所能代表的最大值(32,767)。尝试一些较小的数字。

答案 1 :(得分:0)

您引用的javadoc指出Short.parseShort将数字解析为带符号的数字。

1111111111111111(16 1位)当读取有符号数时表示2 16 - 1或65535.这太大而无法表示为{{1 }}

备选方案:

  • 如果有short的替代解析无符号值,那就行了。 (但没有...)

  • 您可以使用parseShort,对Integer.parseInt结果进行范围检查,然后将其投放到int

  

我认为当使用Short时,16'1'位相当于-1。那么它应该有效吗?

不幸的是,没有。 short方法解析带符号的值。

思考实验:如果用户输入parseInt并意图确实是一个积极的签名号码,该怎么办?即+65535?如何与你的想法相提并论解析方法将有符号和无符号视为可互换?