0

我正在objective-c中构建一个十六进制计算器。我的问题是处理相乘时会溢出的 long long 值。

当我在添加之前添加值时,我会通过执行类似的操作来检查值是否会溢出。

long long leftToAdd = LLONG_MAX - self.runningTotal;

if (self.selectedNumber <= leftToAdd) {
    self.runningTotal += self.selectedNumber;

} else {
    self.selectedNumber -= leftToAdd;   
    self.runningTotal = self.selectedNumber-1;

    self.overflowHasOccured = YES;   
}

如果值会溢出,它会获取溢出值(实际上没有溢出)并添加溢出通知。我希望找到一种方法来做同样类型的事情,但是对于乘法,有人可以帮忙吗?

这是我到目前为止所拥有的。

// if - value would not overflow //
if (self.runningTotal > 0 && self.selectedNumber > 0 
    && LLONG_MAX/self.runningTotal >= self.selectedNumber) {

    self.runningTotal *= self.selectedNumber;

// else - handle overflow //
} else {


}

作为一个附带问题,我需要对部门进行类似的检查吗?

4

1 回答 1

2

您可以按照您用于加法的相同模式检查乘法中的溢出 - 稍后您使用减法来确定界限,对于前者您将使用除法:

long long canMultiplyBy = LLONG_MAX / self.runningTotal;

在所有情况下,如果您支持带符号的数字,您还必须考虑下溢。除法需要除以零检查。

在 C 库中,有用于检查算术、查找check_int64_mul以查找批次的函数(它们都在同一手册页上进行了描述)。这些将是高效的,并且可以直接使用您现在正在做的原始值类型进行操作。

Clang 编译器还提供了一些检查算术内置函数,这些与 C 库函数的不同之处在于返回bool指示和定义为int,longlong long类型而不是int32and int64。请参阅检查算术内置函数

还有NSDecimal- 一个值类型,和NSDecimalNumber- 一个建立在前者之上的对象类型。它们提供扩展精度、最多 38 位十进制数字,以及对上溢、下溢、除零等的控制。请参阅NSDecimalNumberBehaviorsNSDecimalNumberHandler

高温高压

于 2014-04-02T18:54:56.720 回答