我的朋友说“ mod”和“ remainder”之间有区别。
如果是这样,C和C ++有哪些区别?'%'在C语言中是“ mod”还是“ rem”?
我的朋友说“ mod”和“ remainder”之间有区别。
如果是这样,C和C ++有哪些区别?'%'在C语言中是“ mod”还是“ rem”?
Answers:
模数和余数之间存在差异。例如:
-21
mod 4
是3
因为-21 + 4 x 6
is 3
。
但-21
除以4
给出-5
的余数-1
。
对于正值,没有区别。
%
总是其余的,但它可能也有模量(即总为正),因为在C89整数除法被允许轮接近负无穷大的,而不是朝着0,所以在C89,-5 / 2
可能-2
与其余部分一起使用-1
,或者-3
与其余部分一起使用1
,该实现只需要记录一下。C99取消了灵活性,因此-5 / 2
始终如此-2
。
-21
MOD 4
是3
?为什么计算-21 + 4 x 6
呢?
-21 + 4 x 6
是介于0和3
'%'在C语言中是“ mod”还是“ rem”?
在C中,%
是余数1。
...,
/
运算符的结果是代数商,舍弃了任何小数部分...(这通常称为“向零截断”。)C11dr§6.5.56运算
%
符的操作数应为整数类型。C11dr§6.5.52
/
运算符的结果是第一个操作数除以第二个的商。%
运算符的结果是余数 ... C11dr§6.5.55
“ mod”和“ remainder”有什么区别?
C没有定义“ mod”,例如在欧几里得除法或其他模中使用的整数模函数。a%b
当a
为负数时,“欧几里德mod”不同于C的运算。
// a % b
7 % 3 --> 1
7 % -3 --> 1
-7 % 3 --> -1
-7 % -3 --> -1
模为欧几里得除法
7 modulo 3 --> 1
7 modulo -3 --> 1
-7 modulo 3 --> 2
-7 modulo -3 --> 2
候选模码:
int modulo_Euclidean(int a, int b) {
int m = a % b;
if (m < 0) {
// m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
m = (b < 0) ? m - b : m + b;
}
return m;
}
关于浮点数的注意:double fmod(double x, double y)
,即使称为“ fmod”,它也与欧几里得除法“ mod”不同,但类似于C整数余数:
该
fmod
函数计算的浮点余x/y
。C11dr§7.12.10.12
fmod( 7, 3) --> 1.0
fmod( 7, -3) --> 1.0
fmod(-7, 3) --> -1.0
fmod(-7, -3) --> -1.0
歧义消除:C还具有类似的命名函数double modf(double value, double *iptr)
,该函数将参数值分为整数和小数部分,每个部分的类型和符号均与参数相同。除了名称相似外,这与此处的“ mod”讨论无关。
1在C99之前,C的定义%
仍然是除法运算的余数,但随后/
允许负商舍入而不是“截断为零”。请参阅为什么在C89中整数除法会得到不同的值?。因此,在C99之前的版本中,%
代码可以像欧几里得分部“ mod”一样工作。上面的方法modulo_Euclidean()
也可以与其他替代的老式方法一起使用。
在C和C ++和许多语言中,%
余数不是模数运算符。
例如,在运算中-21 / 4
,整数部分是-5
,小数部分是-.25
。余数是除数的小数部分,因此我们的余数是-1
。JavaScript使用剩余运算符并确认
console.log(-21 % 4 == -1);
模运算符就像您有一个“时钟”。想象一个分别在12点,3点,6点和9点位置的值分别为0、1、2和3的圆。将商时间沿时钟方向顺时针步进使我们落在模运算的结果上,或者在我们的示例中为负商时,逆时针旋转,得出3。
注意:模数始终与除数相同,而余数与商相同。当余数中的至少一个为负数时,将除数和余数相加会得出模量。
在数学中,模运算的结果是欧几里得除法的余数。但是,其他约定也是可能的。计算机和计算器具有多种存储和表示数字的方式;因此,它们对模运算的定义取决于编程语言和/或底层硬件。
7 modulo 3 --> 1
7 modulo -3 --> -2
-7 modulo 3 --> 2
-7 modulo -3 --> -1
0 ≤ r < |b|
,这意味着其余又名“模操作。” 始终至少为0。您使用什么定义得出-2和-1?
a%b
和正面a modulo b
时具有相同的含义a,b
。C99 %
用负值精确定义。C调用这个“剩女”。‘模’已在世界有关负值各种定义C时的参数仅使用。‘在正数的情况下模。’