Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Obj中奇怪的mod行为。C_C_Objective C_Modulus - Fatal编程技术网

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计算表达式的方式。