gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:26:33 24 4
gpt4 key购买 nike

我正在练习 Cay S. Horstmann 所著的“Java SE 8 for the Really Impatient”一书中的练习。基于 Number 类改进的练习之一要求:

Write a program that adds, subtracts, divides, and compares numbers between 0 and 232 - 1, using int values and unsigned operations. Show why divideUnsigned and remainderUnsigned are necessary.

问题是,如果将 2 个无符号整数相加,总和可能会溢出整数限制。如果不使用 long 来存储总和并检查它是否大于 Integer.MAX_VALUE,我看不出有什么方法可以防止这种情况发生。是否可以仅使用整数来做到这一点?

最佳答案

Two's complement用于整数值具有整洁的属性,无论您将值解释为有符号还是无符号,对于加法和减法都无关紧要。

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

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

这就是为什么类 java.lang.Integer仅在必要时提供特殊的无符号操作,即比较两个无符号值、除法和余数以及从和到 String(和到 long 的转换,而类型转换从 longint 对于另一个方向来说已经足够了)。

关于numbers - Java 8 无符号整数加法和潜在溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27926843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com