引用 https://www.cnblogs.com/xsfx/p/7122575.html
對於整型數a,b來說,取模運算或者求余運算的方法都是:
1.求 整數商: c = a/b;
2.計算模或者余數: r = a - c*b.
求模運算和求余運算在第一步不同: 取余運算在取c的值時,向0 方向舍入(fix()函數);而取模運算在計算c的值時,向無窮小方向舍入(floor()函數)。
例如:計算-7 Mod 4
那么:a = -7;b = 4;
第一步:求整數商c,如進行求模運算c = -2(向無窮小方向舍入,和我們平時舍入的方向相反),求余c = -1(向0方向舍入);
第二部:計算模和余數的公式相同,但因c的值不同,求模時r = 1,求余時r = -3。
歸納:當a和b符號一致時,求模運算和求余運算所得的c的值一致,因此結果一致。
當符號不一致時,結果不一樣。求模運算結果的符號和b一致,求余運算結果的符號和a一致。
例子,-1/256,按照我們正常的計算應該是-(1/256)約等於0,但是在計算機中就是向無窮小的方向舍入,即c=-1,則計算模就為r=(-1) - (-1) * 256 =255
另外各個環境下%運算符的含義不同,比如c/c++ 為取余,而java、Python則為取模。
C中的取模函數:#include <math.h>
% 運算符
% 只用於整型的計算,后一個數不能是0,參與運算的數據可正可負。
對於x%y ,計算之后結果的正負與 x 的符號相同,如果前者是較小的數,后者是較大的數,那么,結果直接為較小的數。
% 只用於整型的計算,后一個數不能是0,參與運算的數據可正可負。
對於x%y ,計算之后結果的正負與 x 的符號相同,如果前者是較小的數,后者是較大的數,那么,結果直接為較小的數。
result=fmod(10.9,3.9);
printf("10.9%%3.9= %f/n",result); //3.1
位與與取模:
只有b=2^k時,取模取余運算可以用位與運算,運算速度更快
a %b=a&(b-1)