Java 8无符号整数加法和潜在溢出

Abh*_*kar 2 numbers integer-overflow addition unsigned-integer java-8

我正在使用Cay S. Horstmann的书"Java SE 8 for the Really Impatient"进行练习.基于Number课程改进的练习之一是:

编写一个程序,使用值和无符号运算对0到2 32 - 1 之间的数字进行相加,减法,除法和比较int.说明原因divideUnsigned并且remainderUnsigned是必要的.

问题是,如果添加2个无符号整数,则总和可能溢出整数限制.我没有看到一种方法来防止这种情况,如果不使用long来存储总和并检查它是否大于Integer.MAX_VALUE.是否可以仅使用整数执行此操作?

Hol*_*ger 5

两补用于整数值有整齐的属性,添加和减去您是否解释值作为符号或无符号是不相关的.

因此,即使在CPU级别,也没有用于添加/减去有符号或无符号数字的明确指令.一切都与解释有关.

因此,当使用带符号int类型添加或减去两个无符号数时,结果可能会在有符号int范围内溢出.但是,当使用Integer.toUnsignedString结果打印现在的负数时,将是正确的无符号值,假设操作甚至没有在无符号整数值范围内溢出.

这就是为什么该类java.lang.Integer仅在必要时提供特殊的无符号运算,即比较两个无符号值,用于除法和余数以及用于转换和转换String(以及long来自longto 的类型转换int已经足够用于另一个方向).