Obj中奇怪的mod行为。 C

时间:2010-08-05 18:45:11

标签: c objective-c modulus

我有以下代码:

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

所以我的表达式为-1%33。这应该给我32,但反过来给我3 ...我已经仔细检查了调试器中的值。有没有人有任何想法?

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将适用于ab的任一标志,并以额外添加费用为代表给出肯定答案,师。将其计算为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 - 所以它会发生。通常最好不要执行此类操作,特别是如果您希望代码可移植。