0

我有以下代码:

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

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

4

3 回答 3

6

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

于 2010-08-05T18:47:26.227 回答
2

C99 在第 6.5.5 节乘法运算符(我的粗体)中说:

运算符的结果/是第一个操作数除以第二个的商;运算符的结果%是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。

当整数被除法时,/运算符的结果是代数商,其中任何小数部分被丢弃。如果商a/b是可表示的,则表达式 (a/b)*b + a%b应等于a

它说那%是余数,并且没有使用“模数”这个词来描述它。事实上,“模数”这个词在我的 C99 副本中只出现在三个地方,而且都与库有关,与任何运算符无关。

它没有说任何要求余数为正的内容。如果需要正余数,则重写a%bas(a%b + b) % b将适用于 和 的任何一个符号,ab以额外的加法和除法为代价给出肯定的答案。计算它可能更便宜,这m=a%b; if (m<0) m+=b;取决于在您的目标架构中是否缺少分支或额外的部门更便宜。

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

于 2010-08-05T20:38:38.293 回答
1

对负数使用 mod 运算符的结果通常是出乎意料的。例如,这个:

#include <stdio.h>

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

使用 GCC 产生 -1,但我不明白为什么你希望表达式计算为 32 - 所以它去了。通常最好不要执行此类操作,特别是如果您希望您的代码是可移植的。

于 2010-08-05T18:51:34.157 回答