为了获得一个无符号整数,你需要使用Integer.parseUnsignedInt()
函数或做一个手动计算。请记住,Java实际上并不具有无符号整数,Java8只是提供了将int作为无符号对待的能力,以便允许更大范围的正数值。
按照Java 8 Doc for the Integer class,
的无符号整数映射通常与负 编号,以正数比MAX_VALUE较大相关联的值
所以一个无符号的int和一个签署一个之间的转换如果数字大于或等于零且小于或等于Integer.MAX_VALUE
,则它保持不变。如果它大于Integer.MAX_VALUE但仍在无符号范围内,那么要将其存储在int
中,则需要将2^31添加到它,由于添加溢出被定义为的方式将其转换为正确的值一个手术。除了像int
这样的二进制基元外,溢出和下溢只会导致计数器复位并继续计数。
int min = Integer.MIN_VALUE; // -2147483648
int max = Integer.MAX_VALUE; // 2147483647
int overByOne = Integer.MAX_VALUE + 1; // -2147483648 : same as Integer.MIN_VALUE
int underByOne = Integer.MIN_VALUE - 1; // 2147483647 : same as Integer.MAX_VALUE
他们行使只是要求你看看Integer类和测试出无符号运算的各种(新中Java8)方法。 Java没有无符号整数原语,但为了Integer类中的某些新方法的目的,可以将int值视为无符号。
感谢您的回复。我不确定问题是否仅限于打印。如果溢出值被返回并在其他操作中使用,则会出错。在Java 8中引入的“确切”操作[intValueExact](http://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#intValueExact--)将异常这种情况。 –
由于练习要求使用'int'进行计算,因此无法绕过它。当然,你可以用安全的方式定义计算的API,也就是说你可以使用['Integer.toUnsignedLong'](http://docs.oracle.com/javase/8/docs/api/java/lang/ Integer.html#toUnsignedLong-int-)以不能被误解的形式返回值(使用int计算)。当然,如果你使用['toUnsignedString']返回结果作为'String',那么同样的结果会持续(http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#toUnsignedString -int-)“计算”'!='“返回类型” – Holger
我希望除此之外还有更多。如果你读到这个问题,它说“使用int值和未签名的操作”。如果看起来不是微不足道的,可以创建一个使用'+'运算符添加2个整数的方法。除非我们错过了一些东西,否则练习不会增加任何价值。 –