在Objective C中使用长整数的模数

时间:2009-03-18 09:26:40

标签: objective-c math modulo

我正在尝试在long longs上使用模运算符(%),如果数字高于unsigned int的范围,它似乎返回0。是否有我应该使用的操作员或功能,或者我应该自己动手?

- 更新:对不起之前缺少示例代码,我很着急,走出门 -

以下是代码:

long long val = 12345678991245; // always less than LLONG_MAX
int power = 0;
NSMutableArray *powers = [[NSMutableArray alloc] init];
while (pow(10, power) <= val) {
    tVal = (val % (lround(pow(10, power + 1)))) / lround(pow(10, power));
    [powers addObject:[NSNumber numberWithInt:tVal]];
    NSLog(@"Power: %d tVal: %d", power, tVal);
    val -= val % lround(pow(10, power + 1));
    power++;
}

当您查看该NSLog语句所做的输出时,如果数字超过UINT_MAX(数字1,111,111,111,111),则会看到此信息:

2009-03-18 20:42:16.471 Numbers[11197:20b] Power: 0 tVal: 1
2009-03-18 20:42:16.472 Numbers[11197:20b] Power: 1 tVal: 1
2009-03-18 20:42:16.473 Numbers[11197:20b] Power: 2 tVal: 1
2009-03-18 20:42:16.476 Numbers[11197:20b] Power: 3 tVal: 1
2009-03-18 20:42:16.476 Numbers[11197:20b] Power: 4 tVal: 1
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 5 tVal: 1
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 6 tVal: 1
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 7 tVal: 1
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 8 tVal: 1
2009-03-18 20:42:16.478 Numbers[11197:20b] Power: 9 tVal: 0
2009-03-18 20:42:16.478 Numbers[11197:20b] Power: 10 tVal: 0
2009-03-18 20:42:16.479 Numbers[11197:20b] Power: 11 tVal: 0
2009-03-18 20:42:16.479 Numbers[11197:20b] Power: 12 tVal: 0

一切都是洁净的,直到你达到UINT_MAX,然后它才会返回0.

我正在使用Xcode 3.1.2编译iPhone SDK。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

lround返回一个长度为32位的长整数。请改为llround

更好的是,不要使用浮点数进行整数运算。由于每次通过循环将指数增加1,因此不必每次都计算功率。只需将其存储在变量中,并在每次迭代时将其乘以10。

此外,不要将数字除以10的更大和更大的权力,而是每次将数字除以10。

当您在寻找错误时,请将代码分解为更小的步骤,并检查中间操作的结果。