解析 16 位短时出错

Error parsing 16 bit short

short: The short data type is a 16-bit signed two's complement integer. It has a minimum value of -32,768 and a maximum value of 32,767 (inclusive)

为什么会出现以下情况

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

Return

java.lang.NumberFormatException: Value out of range.

An exception of type NumberFormatException is thrown if any of the following situations occurs:

  • The first argument is null or is a string of length zero.

  • The radix is either smaller than Character.MIN_RADIX or larger than Character.MAX_RADIX.

  • Any character of the string is not a digit of the specified radix, except that the first character may be a minus sign '-' ('\u002D') or plus sign '+' ('\u002B') provided that the string is longer than length 1.

  • The value represented by the string is not a value of type short.

我假设错误来自最后一个项目符号,但是 我认为使用 Short 时 16 个“1”位相当于 -1。因此,它应该是有效的?

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

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

1111111111111111(16 1 位)当作为有符号数读取时表示 216 - 1 或 65535。这太大而无法表示作为 short.

备选方案:

  • 如果有 parseShort 的替代方案来解析无符号值,那将可行。 (但是没有...)

  • 您可以使用 Integer.parseInt,对 int 结果进行范围检查,然后将其转换为 short.


I thought 16 '1' bits is equivalent to -1 when using Short. Thus, it should be valid?

很遗憾,没有。 parseInt 方法解析有符号值。

思考实验:如果用户输入 1111111111111111 的意图是它真的意味着正数 signed;即 +65535?这如何与您认为 parse 方法将有符号和无符号视为可互换的想法相吻合?