繁花不似锦
%在C中是指“mod”还是“rem”?在C中,%是余数1..的结果/算子是带任意小数部分的代数商.(这通常被称为“向零截断”)。C11dr§6.5.5 6的操作数%运算符应具有整数类型。C11dr§6.5.5 2的结果/运算符是从第一个操作数除以第二个操作数的商;%运算符是余数..C11dr§6.5.5 5“MOD”和“余数”有什么区别?C不定义“mod”,例如欧氏除法或其他模块..“欧几里得模”与C的不同a%b操作时a是阴性的。 // 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.1 2fmod( 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()也会用这个老旧的余数。