Obj中奇怪的mod行为。C
我有以下代码:Obj中奇怪的mod行为。C,c,objective-c,modulus,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分。。。我在调试器中仔细检查了这些值。有人有什么想法吗?在C中,模运算符不适用于负数。它给出了一个余数,而不是像它的俗名所暗示的那样进行模运算。对负数使用mo
NSInteger index1 = (stop.timeIndex - 1); //This will be -1
index1 = index1 % [stop.schedule count]; // [stop.schedule count] = 33
所以我有一个表达式-1%33。这应该给我32分,但却给了我3分。。。我在调试器中仔细检查了这些值。有人有什么想法吗?在C中,模运算符不适用于负数。它给出了一个余数,而不是像它的俗名所暗示的那样进行模运算。对负数使用mod运算符的结果通常是出乎意料的。例如,这:
#include <stdio.h>
int main() {
int n = -1 % 33;
printf( "%d\n", n );
}
使用GCC生成-1,但我不明白为什么您希望表达式的计算结果为32,所以它是这样的。通常最好不要执行此类操作,尤其是如果您希望代码可移植。C99在第6.5.5节乘法运算符中指出: /运算符的结果是第一个操作数除以 第二%运算符的结果是余数。在这两种操作中,如果 第二个操作数为零,行为未定义 当整数被除时,/运算符的结果是具有任意值的代数商 部分被丢弃。如果商a/b是可表示的,则表达式 a/b*b+a%b应等于a 它说%是余数,并没有用模数这个词来描述它。事实上,在我的C99副本中,单词模只出现在三个地方,这些地方都与库有关,而与任何操作符无关
它没有说任何要求余数为正的东西。如果需要正余数,则将a%b重写为a%b+b%b将适用于a和b的任一符号,并以额外的加法和除法为代价给出肯定答案。将其计算为m=a%b可能更便宜;如果m%在C和Objective-C中的行为与您预期的负输入不同-请参阅前面的问题:可能需要作为重复项关闭:我正在使用LLVM编译,这可能解释了差异,但32是正确的数学解;这也是python计算表达式的方式。