补码及进制转换
有符號二進制整數有正數和負數。在 x86 處理器中,MSB 表示的是符號位:0 表示正數,1 表示負數。下圖展示了 8 位的正數和負數:
?
補碼表示
負整數用補碼(two`s-complement)表示時,使用的數學原理是:一個整數的補碼是其加法逆元。(如果將一個數與其加法逆元相加,結果為 0。)
補碼表示法對處理器設計者來說很有用,因為有了它就不需要用兩套獨立的電路來處理加法和減法。例如,如果表達式為 A-B,則處理器就可以很方便地將其轉換為加法表達式:A+(-B)。
將一個二進制整數按位取反(求補)再加 1,就形成了它的補碼。以 8 位二進制數 0000 0001 為例,求其補碼為 1111 1111,過程如下所示:
| 初始值 | 00000001 |
| 第一步:按位取反 | 11111110 |
| 第二步:將上一步得到的結果加 1 | ? 11111110 +00000001 |
| 和值:補碼表示? | 11111111 |
1111 1111 是 -1 的補碼。補碼操作是可逆的,因此,11111111 的補碼就是 0000 0001。
十六進制數的補碼
將一個十六進制整數按位取反并加 1,就生成了它的補碼。一個簡單的十六進制數字取反方法就是用 15 減去該數字。下面是一些十六進制數求補碼的例子:
6A3D –> 95C2 + 1 –> 95C3
95C3 –> 6A3C + 1 –> 6A3D
有符號二進制數到十進制的轉換
用下面的算法計算一個有符號二進制整數的十進制數值:
- 如果最高位是 1,則該數是補碼。再次對其求補,得到其正數值。然后把這個數值看作是一個無符號二進制整數,并求它的十進制數值。
- 如果最高位是 0,就將其視為無符號二進制整數,并轉換為十進制數。
例如,有符號二進制數 1111 0000 的最高有效位是 1,這意味著它是一個負數,首先要求它的補碼,然后再將結果轉換為十進制。過程如下所示:
| 初始值 | 11110000 |
| 第一步:按位取反 | 00001111 |
| 第二步:將上一步得到的結果加 1 | ? ?00001111 +? ? ? ? ? ? ? ?1 |
| 第三步:生成補碼 | 00010000 |
| 第四步:轉換為十進制 | 16 |
由于初始值(1111 0000)是負數,因此其十進制數值為 -16。
有符號十進制數到二進制的轉換
有符號十進制整數轉換為二進制的步驟如下:
- 把十進制整數的絕對值轉換為二進制數。
- 如果初始十進制數是負數,則在第 1 步的基礎上,求該二進制數的補碼。
比如,十進制數 -43 轉換為二進制的過程為:
1) 無符號數 43 的二進制表示為 0010 1011。
2) 由于初始數值是負數,因此,求出 0010 1011 的補碼 1101 0101 這就是十進制數 -43 的二進制表示。
有符號十進制數到十六進制的轉換
有符號十進制整數轉換為十六進制的步驟如下:
- 把十進制整數的絕對值轉換為十六進制數。
- 如果初始十進制數是負數,則在第 1 步的基礎上,求該十六進制數的補碼。
有符號十六進制數到十進制的轉換
有符號十六進制整數轉換為十進制的步驟如下:
- 如果十六進制整數是負數,求其補碼,否則保持該數不變。
- 把第 1 步得到的整數轉換為十進制。如果初始值是負數,則在該十進制整數的前面加負號。
通過檢查十六進制數的最高有效(最高)位,就可以知道該數是正數還是負數。如果最高位 ≥ 8,該數是負數;如果最高位 ≤ 7,該數是正數。比如,十六進制數 8A20 是負數,而 7FD9 是正數。
最大值和最小值
n 位有符號整數只用 n-1 來表示該數的范圍。下表列出了有符號單字節、字、雙字、四字和八字的最大值與最小值。
?
匯編語言基本概念簡介
1.1 匯編語言是什么
1.2 匯編語言的應用
1.3 虛擬機是什么
1.4 匯編語言的數據表示
1.5 二進制整數
1.6 二進制加法運算
1.7 字節(byte)
1.8 十六進制整數
1.9 補碼及進制轉換
1.10 二進制減法運算
| 有符號字節 | -27?到 +27-1 | 8 | 有符號四字 | -263?到 +263-1 | 64 |
| 有符號字 | -215?到 +215-1 | 16 | 有符號八字 | -2127?到 +2127-1 | 128 |
| 有符號雙字 | -231?到 +231-1 | 32 ? | ? | ? | ? |
總結
- 上一篇: 架构师之DNS实战
- 下一篇: 汇编语言标识符及其命名规则