解析16位短路时出错

问题描述 投票:-1回答:2

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。那么,它应该有效吗?

java parsing primitive short
2个回答
0
投票

你引用的javadoc声明Short.parseShort将数字解析为带符号的数字。

1111111111111111(16个1数字)作为带符号的数字读取意味着216-1或65535.这太大而不能表示为short

备择方案:

  • 如果有一个替代parseShort解析无符号值,那将是有效的。 (但没有...)
  • 您可以使用Integer.parseInt,对int结果进行范围检查,然后将其投射到short

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

很不幸的是,不行。 parseInt方法解析带符号的值。

思考实验:如果用户输入1111111111111111的意图是它真正意味着一个正号码,那该怎么办?即+65535?如何将您的想法与解析方法视为已签名和无符号可互换?


3
投票

1111111111111111应转换为65535,大于short可以表示的最大值(32,767)。尝试一些较小的数字。

© www.soinside.com 2019 - 2024. All rights reserved.