最近在讀C++ primer的時候,發現p32上寫道:當我們賦給無符號類型一個超出它表示范圍的值時,結果是初始值對無符號類型表示數值總數取模后的余數。因此,把-1賦值給8比特大小的unsigned char所得的結果是255。
-1怎么取模?
這里先明確一下取模和取余的區別:(百度百科)
取模運算(“Module Operation”)和取余運算(“Complementation ”)兩個概念有重疊的部分但又不完全一致。主要的區別在於對負整數進行除法運算時操作不同。取模主要是用於計算機術語中。取余則更多是數學概念。模運算在數論和程序設計中都有着廣泛的應用。
對於整型數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取模的過程就是:
c=-1/256=-1;
r =-1 -(-1 *256) =255(如果是取余,r=-1)
從計算機存儲的角度
在計算機中數值按補碼存儲的,-1的原碼是10000001(有符號8位),補碼:11111111。所以直接賦值給unsigned char, 11111111等於255。其實相當於類型轉換的時候什么都沒干,直接意義就轉換成了255,但是從數學的角度上就是對256取模。