实际上有符号和无符号之间的区别

时间:2019-05-11 14:51:54

标签: java unsigned-integer

我已经搜索并阅读了许多有关此区别的以前的答案,但是我仍然没有得到任何帮助,例如,使用此行代码:

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)

3 个答案:

答案 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年代初期,人们开始使用这种东西的时候)。