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。那么它应该有效吗?
答案 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?如何与你的想法相提并论解析方法将有符号和无符号视为可互换?