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