C語言之原碼、反碼和補碼
原碼、反碼和補碼
1).數據在內存中存儲的時候都是以二進制的形式存儲的.
int num = 10;
原碼、反碼、補碼都是二進制.只不過是二進制的不同的表現形式.
數據是以補碼的二進制存儲的.
2). 1個int類型的變量.在內存中占據4個字節, 32位.
00000000 00000000 00000000 00000000
在不考慮正負的情況下.1個int類型的變量可以表示接近43e種數據.
為了可以表示正負性.使用最高為來表示這個數的正負性.
如果最高為是0 那麽表示這個數是1個正數
如果最高為是1 那麽表示這個數是1個負數.
所以,來表示數據的只有31位. 所以,1個int類型的變量.
最小值是: -2147483648 最大值是:2147483647
3). 原碼
最高位表示符號位. 剩下的位數.是這個數的絕對值的二進制.
10的原碼.
00000000 00000000 00000000 00001010
-8的原碼.
10000000 00000000 00000000 00001000
絕對值: 正數的絕對值是自己,負數的絕對值去掉負號.
-20.
10000000 00000000 00000000 00010100
4). 反碼
正數的反碼就是其原碼.
負數的反碼就是在其原碼的基礎之上 符號位不變,其他位取反.
10的反碼:
10的原碼:00000000 00000000 00000000 00001010
10的反碼:00000000 00000000 00000000 00001010
-8
-8的原碼:10000000 00000000 00000000 00001000
-8的反碼:11111111 11111111 11111111 11110111
5). 補碼
正數的補碼就是其原碼.
負數的補碼就是在其反碼的基礎之上+1
10.
10的原碼:00000000 00000000 00000000 00001010
10的反碼:00000000 00000000 00000000 00001010
10的補碼:00000000 00000000 00000000 00001010
-8
-8的原碼:10000000 00000000 00000000 00001000
-8的反碼:11111111 11111111 11111111 11110111
-8的補碼:11111111 11111111 11111111 11111000
6). 任何數據都是以其二進制的補碼形式存儲在內存中的.
int num = -8;
7). 為什麽數據要以補碼的形式存儲呢?
計算機中只有加法沒有減法.為了更加低成本的計算出結果,所以使用補碼來存儲數據.
3 + 2;
3 - 2; 這個減法運算對於計算機而言它的理解是 3 + (-2); 1
使用原碼計算.
3的原碼 00000000 00000000 00000000 00000011
-2的原碼 10000000 00000000 00000000 00000010
----------------------------------------------------
10000000 00000000 00000000 00000101 結果是1個負數明顯是不對的
使用反碼計算.
3 的反碼: 00000000 00000000 00000000 00000011
-2的反碼: 11111111 11111111 11111111 11111101
--------------------------------------------------
00000000 00000000 00000000 00000000 0
使用補碼計算
3 的補碼: 00000000 00000000 00000000 00000011
-2的補碼: 11111111 11111111 11111111 11111110
-------------------------------------------------
00000000 00000000 00000000 00000001 1
註:使用補碼來做運算效率是最高的.
C語言之原碼、反碼和補碼