我有以下代码:Obj中的怪异mod行为。 ç
NSInteger index1 = (stop.timeIndex - 1); //This will be -1
index1 = index1 % [stop.schedule count]; // [stop.schedule count] = 33
所以,我必须表达-1%33.本应该给我32,而是给我3 ......我仔细检查过的值在调试器。有没有人有任何想法?
我有以下代码:Obj中的怪异mod行为。 ç
NSInteger index1 = (stop.timeIndex - 1); //This will be -1
index1 = index1 % [stop.schedule count]; // [stop.schedule count] = 33
所以,我必须表达-1%33.本应该给我32,而是给我3 ......我仔细检查过的值在调试器。有没有人有任何想法?
C99说,在第6.5.5乘法运算符(粗体矿):
的
/
操作的结果是由第二 从所述第一操作数的除法的商; 运营商%
的结果是其余的。在两种操作中,如果第二个操作数的值为 ,则行为是未定义的。当整数分开时,
/
算子的结果是丢弃小数部分的代数商。如果商数a/b
可表示,则表达式(a/b)*b + a%b
应等于a
。
它说%
是余数,并没有用“模量”一词来形容它。事实上,“模数”这个词只出现在我的C99副本的三个地方,这些都与图书馆有关,而不是与任何经营者有关。
它没有说任何要求余数是正数的东西。如果需要正余数,那么重写a%b
为(a%b + b) % b
将适用于a
和b
的任意一个符号,并以牺牲额外的加法和除法为肯定答案。根据您的目标架构中错过的分支机构或额外的分支机构是否便宜,将其计算为m=a%b; if (m<0) m+=b;
可能会更便宜。
编辑:我对Objective-C一无所知。您的原始问题标记为C,并且所有答案都反映了C语言,尽管您的示例似乎是Objective-C代码。我假设知道C的真实情况是有帮助的。
在C中,模数运算符不适用于负数。 (它给出了余数,而不是按照其通用名称所暗示的那样进行模运算。)
在负数上使用mod运算符的结果通常是意料之外的。例如,这个:
#include <stdio.h>
int main() {
int n = -1 % 33;
printf("%d\n", n);
}
用GCC产生-1,但是我看不出为什么你期望表达式的计算结果为32--这样就行了。通常最好不要执行这样的操作,特别是如果你希望你的代码是可移植的。
我编译使用LLVM以便可能解释差异,但32是一个正确的数学解决方案;这也是python如何评估表达式的。 – kodai 2010-08-05 19:07:36
'%'行为与C和Objective-C中的负向输入相比的行为不同 - 请参阅前面的这个问题:http://stackoverflow.com/questions/2430737/modulo-operator-in-objective-c-returns错误的结果 – 2010-08-05 18:50:47
可能需要关闭为重复:http://stackoverflow.com/questions/2430737/modulo-operator-in-objective-c-returns-the-wrong-result – 2010-08-05 18:51:22