我正在尝试在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。
有什么想法吗?
答案 0 :(得分:4)
lround
返回一个长度为32位的长整数。请改为llround
。
更好的是,不要使用浮点数进行整数运算。由于每次通过循环将指数增加1,因此不必每次都计算功率。只需将其存储在变量中,并在每次迭代时将其乘以10。
此外,不要将数字除以10的更大和更大的权力,而是每次将数字除以10。
当您在寻找错误时,请将代码分解为更小的步骤,并检查中间操作的结果。