在一个C程序中,我尝试了以下操作(只是为了检查行为)
x = 5 % (-3);
y = (-5) % (3);
z = (-5) % (-3);
printf("%d ,%d ,%d", x, y, z);
在gcc中输出为(2,-2,-2)我以为每次都会有积极的结果。模量可以是负的吗?有人能解释一下这种行为吗?
在一个C程序中,我尝试了以下操作(只是为了检查行为)
x = 5 % (-3);
y = (-5) % (3);
z = (-5) % (-3);
printf("%d ,%d ,%d", x, y, z);
在gcc中输出为(2,-2,-2)我以为每次都会有积极的结果。模量可以是负的吗?有人能解释一下这种行为吗?
当前回答
看来问题不在现场操作。
int mod(int m, float n)
{
return m - floor(m/n)*n;
}
其他回答
其他答案已经在C99或更高版本中解释过,涉及负操作数的整数除法总是截断为零。
注意,在C89中,结果向上舍入还是向下舍入是由实现定义的。因为(a/b) * b + a%b在所有标准中都等于a,包含负操作数的%的结果也是在C89中实现定义的。
模运算的结果取决于分子的符号,因此y和z都是-2
这是参考资料
http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_14.html
整数的除法 介绍整数除法的函数。 这些函数在GNU C库中是多余的,因为在GNU C中 '/'运算符总是四舍五入到零。但是在其他C中 实现中,'/'可以用不同的负参数四舍五入。 Div和ldiv很有用,因为它们指定了如何舍入 商:趋于零。余数的符号和 分子。
看来问题不在现场操作。
int mod(int m, float n)
{
return m - floor(m/n)*n;
}
C99要求当a/b是可表示的时:
(a/b) * b + a%b等于a
从逻辑上讲,这是有道理的。对吧?
让我们看看这会导致什么:
例A. 5/(-3) = -1
=> (-1) * (-3) + 5%(-3) = 5
这只能在5%(-3)= 2时发生。
例b (-5)/3 = -1
=> (-1) * 3 + (-5)%3 = -5
只有当(-5)%3为-2时才会发生这种情况
C中的%操作符不是模操作符而是余数操作符。
模运算符和余数运算符不同于负值。
对于余数运算符,结果的符号与被除数(分子)的符号相同,而对于模运算符,结果的符号与除数(分母)的符号相同。
C将a % b的%操作定义为:
a == (a / b * b) + a % b
用/表示整型除法,并截断为0。这是对0(而不是负无穷)的截断,它将%定义为余数运算符而不是模运算符。