我已经搜索并阅读了许多有关此区别的以前的答案,但是我仍然没有得到任何帮助,例如,使用此行代码:
System.out.println(Integer.parseUnsignedInt("11111111111111111111111111111111", 2));
我读到Unsigned可以拥有更大的正值,而没有负值。 Unsigned使用前导位作为值的一部分,而signed版本使用最左边的位来标识数字是正数还是负数。有符号整数可以同时包含正数和负数。 Unisgned可以大于MAX_VALUE,因此sysout为什么给出-1却为负数。对于此行代码:
System.out.println(Integer.parseInt("11111111111111111111111111111111", 2));
为什么这行会给出错误(32乘1)?带符号的int是否不应该将第一个1视为减号,而将其他31 1视为正值? (因此应为-MAX_VALUE)
答案 0 :(得分:1)
Java 没有无符号整数类型。调用parseUnsignedInt
时,它不会不返回无符号整数,因为在Java中没有这样的东西。
相反,parseUnsignedInt
将输入解析为无符号的32位值,然后返回具有相同位的 signed 32位值。 / p>
如果您提供的数字的无符号表示中设置了前导位,则它将返回负数,因为所有设置了该位的 signed 数均为负。
>答案 1 :(得分:0)
为什么这行会给出错误(32乘1)?不是带符号的int 假设将第一个1视为减号,将其他31 1视为减号 正值? (因此应为-MAX_VALUE)
出于完全相同的原因,它会抛出NumberFormatException
Integer.parseInt("2147483648", 10)
确实。该字符串不代表根据指定的基数解释时可以表示为int
的数字。 int
使用32位代表值仅与外围相关。如果要使用Integer.parseInt()
解析一个负值,则该字符串应包含一个前导减号:
Integer.parseInt("-1111111111111111111111111111111", 2)
甚至
Integer.parseInt("-10000000000000000000000000000000", 2) // note: 32 digits
该方法未将位直接映射到int
表示形式。它将字符串解释为数字的文本表示形式。
答案 2 :(得分:0)
“无符号”可以大于MAX_VALUE,所以为什么sysout给出 -1,是负数。
Integer
保留一个32位值。 parseUnsignedInt(32 one-bits,2)的结果是一个设置了所有位的值。旁观者眼中的“含义”是什么。大多数Java都认为整数值是有符号的。例如,println
使用的格式化程序将值视为带符号,结果为-1
。
您真正拥有的所有“整数”都是32位值。 parseUnsignedInt()专门处理其输入参数,但随后必须将结果存储在标准Integer中。没有什么可以说这些位应该是“无符号的”。如果要将值视为无符号,则不能使用任何将其视为有符号的值,因为Java确实没有unsigned-integer类型。
不是将正整数1当作减号,而将整数1当作正负号的整数。 其他31个1为正值? (因此应为-MAX_VALUE)
请参阅此部分的其他答案。
我想您期望的表示形式是“符号和大小”表示形式,其中高位表示符号,其余位表示(正)值。我不知道当前使用整数符号和幅值的计算机(可能是在1950年代初期,人们开始使用这种东西的时候)。