一、編碼理解:
1、原碼:
- 正數:按照絕對值大小轉換成的二進制數;
- 負數:按照絕對值大小轉換成的二進制數,然后最高位補1,稱為原碼。
00000000 00000000 00000000 00000101 是 5的 原碼;
10000000 00000000 00000000 00000101 是 -5的 原碼。
2、反碼:
- 正數:與原碼相同;
- 負數:該數的原碼除符號位外各位取反。
正數00000000 00000000 00000000 00000101 的反碼還是 00000000 00000000 00000000 00000101 ;
負數10000000 00000000 00000000 00000101每一位取反(除符號位),得11111111 11111111 11111111 11111010。
稱:10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互為反碼。
3、補碼:
- 正數:與原碼相同;
- 負數:該數的原碼除符號位外各位取反,然后在最后一位加1。
10000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111010。
那么,補碼為:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在計算機中表達為:11111111 11111111 11111111 11111011。轉換為十六進制:0xFFFFFFFB。
二、二進制
數據的二進制表示即為數據的補碼,也是計算機底層的存儲方式。
- 正數的反碼和補碼都與原碼相同。
- 負數的原碼為:絕對值轉換為二進制,然后最高位補1,稱為原碼;
- 負數的反碼為:對該數的原碼除符號位外各位取反。
- 負數的補碼為:對該數的原碼除符號位外各位取反,然后在最后一位加1。
三、十進制轉二進制
3.1 整數:即求補碼的方法(除基倒取余法)
3.1.1 正整數:
- 輸入一個十進制數n;
- 每次用n除以2;
- 把余數記下來,再用商去除以2...
- 依次循環,直到商為0結束;
- 把余數倒着依次排列,就構成了轉換后的二進制數。
3.1.2 負整數:
- 先取絕對值得到正數;
- 求出該正數的二進制表示,方法參考上面;
- 對上一步的結果最高位補1,得到該負整數的原碼;
- 根據改原碼求補碼,即為二進制;(除符號位外各位取反,然后在最后一位加1。)
3.2 小數:(不分正負)
3.2.1 方法:乘2取整,順序排列
3.2.2 具體步驟
- 用2乘十進制小數,可以得到積;
- 將積的整數部分取出,再用2乘余下的小數部分,又得到一個積;
- 再將積的整數部分取出,如此進行,不斷重復2;
- 直到積中的小數部分為零或者達到所要求的精度為止。
四、二進制轉十進制
4.1 正整數:(最高位為符號位)
例:
二進制正數:0000 1010 (十進制為10)
轉換為十進制數: 1*2^3+0*2^2+1*2^1+0*2^0=10
4.2 負整數:(最高位為符號位)
+10的原碼:0000 1010
-10的原碼:1000 1010
-10的反碼:1111 0101
-10的補碼:1111 0110
最終。-10的二進制:1111 0110 (十進制為-10)
轉換為十進制數:
1*2^6-1*2^5-1*2^4-0*2^3-1*2^2-1*2^1-0*2^0
=2^4-2^2-2^1=16-4-2=10(前面加一個負號,即為-10)
注意:
- 最高位為符號位,不做計算;
- 計算時,從左往右,從2^0開始。所以8位有符號二進制,符號位后的第一位對應的是2^6,而不是2^7
4.3 小數:
二進制:0000 1010.1100
轉換為十進制:
小數點前+小數點后
= (1*2^3+0*2^2+1*2^1+0*2^0)+(1*2^(-1)+1*2^(-2)+0*2^(-3)+0*2^(-4))
=10+0.75
=10.75
五、參考:
- 負數與二進制換轉方法 - 益達先生的個人空間 - 開源中國 https://my.oschina.net/lolsi/blog/269154
注:主要是對原碼、反碼、補碼的介紹。
