今天在看《C++Primer》中文版時,遇到一個問題,如下:
? ? ? ? C++中,把負值賦給unsigned對象是完全合法的,其結果是該負數對該類型的取值個數求模后的值。所以,如果把-1賦給8位的unsigned char,那么結果是255,因為255是-1對256求模后的值。
? ? ? ? 對于-1對256取模的值為255,不明白怎么得出的結果,所以在查詢資料之后,對取余和取模進行記錄,區分他們的區別,以防下次再出錯。
對于整型數a,b來說,取余和取模的運算方法為:
1、求整數商:c = a/b;
2、取余和取模:r = a - c * b;
求余和求模運算的區別在于:取余運算在取c的值時,向0 方向舍入;而取模運算在計算c的值時,向負無窮方向舍入。
例如:a= -7 ,b = 4
取余時:c = -1(向0方向舍入),r = 3,即余數為3
取模時:c = -2(向負無窮方向舍入),r = 1,即模為1
可以歸納為:
當a和b符號一致時,求模運算和求余運算所得的c的值一致,因此結果一致。
當符號不一致時,求模運算結果的符號和b一致,求余運算結果的符號和a一致。
注:另外在各個環境下%運算符的含義不同,比如c/c++,java 為取余,而python則為取模。
以下程序為有符號和無符號的取余情況:
#includeusing namespace std;
int main()
{
int unbig = 10,big = -10,unsmall = 4,small = -4;
cout << "10/4= "<< unbig/unsmall << endl;//2
cout << "10/(-4)= "<< unbig/small << endl;//-2
cout << "(-10)/4= "<< big/unsmall << endl;//-2
cout << "(-10)/(-4)= "<< big/small << endl;//2
cout << endl;
cout << "10%4= "<< unbig%unsmall << endl;//2
cout << "10%(-4)= "<< unbig%small << endl;//2
cout << "(-10)%4= "<< big%unsmall << endl;//-2
cout << "(-10)%(-4)= "<< big%small << endl;//-2
cout << endl;
cout << "4%10= "<< unsmall%unbig << endl;//4
cout << "(-4)%10= "<< small%unbig << endl;//-4
cout << "4%(-10)= "<< unsmall%big << endl;//4
cout << "(-4)%(-10)= "<< small%big << endl;//-4
return 0;
}