我有以下代码:
NSInteger index1 = (stop.timeIndex - 1); //This will be -1
index1 = index1 % [stop.schedule count]; // [stop.schedule count] = 33
所以我的表达式为-1%33。这应该给我32,但反过来给我3 ...我已经仔细检查了调试器中的值。有没有人有任何想法?
答案 0 :(得分:6)
在C中,模数运算符不适用于负数。 (它给出了一个余数,而不是像通常的名字那样进行模运算。)
答案 1 :(得分:2)
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的真实情况是有帮助的。
答案 2 :(得分:1)
在负数上使用mod运算符的结果通常是意外的。例如,这个:
#include <stdio.h>
int main() {
int n = -1 % 33;
printf( "%d\n", n );
}
使用GCC生成-1,但我不明白为什么你期望表达式计算为32 - 所以它会发生。通常最好不要执行此类操作,特别是如果您希望代码可移植。