2010-08-05 15 views
0

我有以下代码:Obj中的怪异mod行为。 ç

NSInteger index1 = (stop.timeIndex - 1); //This will be -1 
index1 = index1 % [stop.schedule count]; // [stop.schedule count] = 33 

所以,我必须表达-1%33.本应该给我32,而是给我3 ......我仔细检查过的值在调试器。有没有人有任何想法?

+0

'%'行为与C和Objective-C中的负向输入相比的行为不同 - 请参阅前面的这个问题:http://stackoverflow.com/questions/2430737/modulo-operator-in-objective-c-returns错误的结果 – 2010-08-05 18:50:47

+0

可能需要关闭为重复:http://stackoverflow.com/questions/2430737/modulo-operator-in-objective-c-returns-the-wrong-result – 2010-08-05 18:51:22

回答

2

C99说,在第6.5.5乘法运算符(粗体矿):

/操作的结果是由第二 从所述第一操作数的除法的商; 运营商%的结果是其余的。在两种操作中,如果第二个操作数的值为 ,则行为是未定义的。

当整数分开时,/算子的结果是丢弃小数部分的代数商。如果商数a/b可表示,则表达式 (a/b)*b + a%b应等于a

它说%是余数,并没有用“模量”一词来形容它。事实上,“模数”这个词只出现在我的C99副本的三个地方,这些都与图书馆有关,而不是与任何经营者有关。

它没有说任何要求余数是正数的东西。如果需要正余数,那么重写a%b(a%b + b) % b将适用于ab的任意一个符号,并以牺牲额外的加法和除法为肯定答案。根据您的目标架构中错过的分支机构或额外的分支机构是否便宜,将其计算为m=a%b; if (m<0) m+=b;可能会更便宜。

编辑:我对Objective-C一无所知。您的原始问题标记为C,并且所有答案都反映了C语言,尽管您的示例似乎是Objective-C代码。我假设知道C的真实情况是有帮助的。

6

在C中,模数运算符不适用于负数。 (它给出了余数,而不是按照其通用名称所暗示的那样进行模运算。)

1

在负数上使用mod运算符的结果通常是意料之外的。例如,这个:

#include <stdio.h> 

int main() { 
    int n = -1 % 33; 
    printf("%d\n", n); 
} 

用GCC产生-1,但是我看不出为什么你期望表达式的计算结果为32--这样就行了。通常最好不要执行这样的操作,特别是如果你希望你的代码是可移植的。

+0

我编译使用LLVM以便可能解释差异,但32是一个正确的数学解决方案;这也是python如何评估表达式的。 – kodai 2010-08-05 19:07:36