今天,做個關於二進制的算法題,突然有個問題一直想不通為什么~5是6,計算機基礎知識不過關啊,所以現在來彌補下,正數和負數在計算機中是怎么存儲和計算的。
講講計算機中的存儲形式:
計算機中存儲的數都是以補碼的方式存儲的,而正數的原碼,反碼,補碼都是一樣的。但是負數的原碼,反碼,補碼是不一樣的。
下面都是以java中的int i=5為例。
正數5的原碼就是其二進制碼:00000000 00000000 00000000 00000101
反碼是:00000000 00000000 00000000 00000101
補碼是:00000000 00000000 00000000 00000101
-5的原碼是:10000000 00000000 00000000 00000101;
反碼是:11111111 11111111 11111111 11111010;//除符號位所有位取反
補碼是: 11111111 11111111 11111111 11111011;//反碼加1
那么java中~5是怎么計算的?
~5的補碼:
原碼:00000000 00000000 00000000 00000101
取反得補碼:11111111 11111111 11111111 11111010
求~5的原碼:由上面的補碼的反碼:11111111 11111111 11111111 11111001
取反得原碼:10000000 00000000 00000000 00000110;//也就是-6
計算機中的計算都是以補碼的形式進行計算的:
-5的補碼是: 11111111 11111111 11111111 11111011
1的補碼是:00000000 00000000 00000000 00000001
那么-5+1就是:
11111111 11111111 11111111 11111011 |
+ 00000000 00000000 00000000 00000001 |
11111111 11111111 11111111 11111100 |
11111111 11111111 11111111 11111100是計算機中的補碼,減1轉換為反碼是:11111111 11111111 11111111 11111011,取反得原碼是:10000000 00000000 00000000 00000100;
補充一點:
二進制的減法:
0-0=1-1=0
1-0=1
0-1=1(向高位借位)
1 1 0 0 0 0 1 1
- 0 0 1 0 1 1 0 1
-------------------
1 0 0 1 0 1 1 0