2.1數據的表示
整理自Beokayy_
1.進制轉換
十六進制與二進制的轉換
一位十六進制等于四位二進制
四位二進制等于一位十六進制
0x173A4C=0001 0111 0011 1010 0100 1100
十六進制與十進制的轉換
十六轉十:每一位數字乘以相應的16的冪再相加
十轉十六:先短除法轉二,再四位二進制對應一位十六進制
二進制與十進制的轉換
十轉二:短除法
二轉十:每一位數字乘以相應的2的冪乘再相加
2.機器數與真值
真值:帶有正負號的數值
機器數:需要按照編碼形式來解釋其含義
這兩個概念是最初始的概念,不要與后面的各種編碼混淆
3.定點數與浮點數
定點數
小數點位置不變的表示方法叫做定點表示法,用這種方法表示出的數叫做定點數。
定點數理論上可以表示整數和小數。
- 對于純整數和純小數,可以直接二進制轉換,因為小數點分別在最低位和最高位
- 對于整數加小數,則需要約定小數點的位置。例如約定八位二進制數前五位是整數,后三位是小數。此時表達的精度不夠,范圍也很低。
綜上,定點數通常用來表示小數。
浮點數
計算機中使用浮點數表示小數,類似于數學中的科學計數法。
IEEE浮點標準用V=(-1)S*M*2 E的形式來表示一個數:
- 符號位S:決定這個數是正數(S=0)還是負數(S=1)。
- 尾數M:M是一個二進制小數,在IEEE754標準中用原碼表示。
- 階碼E:對浮點數加權,這個權重是2的E次冪,在IEEE754標準中用移碼表示。
4.帶符號數的編碼
為了能方便地對機器數進行算術運算,計算機設計了多種符號位與數值一起編碼的方法,最常用的編碼方式為:原碼、反碼、補碼以及移碼。
原碼
- 用機器數的最高位表示數的符號,其余各位表示數的絕對值。
- 真值0的原碼表示有兩種,即[+0]原=00000和[-0]原=10000。
補碼
- 正數的補碼與原碼相同,負數的補碼符號位為1,其他位為原碼取反,未位加1。
- 補碼系統的最大優點是可以在加法或減法處理中,加法電路就可以處理各種有符號數加法,而且減法可以用一個數加上另一個數的補碼來表示,因此只要有加法電路和補碼電路即可以完成各種有符號數加法和減法,在電路設計上相當方便。
- 計算機中的帶符號數都用補碼表示。
- 特別規定:[x]補=10000000=-128,[x]補=1.0000000=-1。因此,小數補碼比原碼多表示一個"-1",正數補碼比原碼多表示一個"-2(n-1)"(機器字長為n)。
- 真值0的補碼表示是唯一的,即[+0]補=[-0]補=00000。
- 用權值理解補碼(補碼一步得到真值):
按照二進制轉十進制的加權求值法,但是符號位的權值是負的。- 例如:10110=-24+22+21=-10
反碼
原碼和補碼轉換的媒介
- 正數:原碼反碼補碼相同
- 負數:符號位不變其余取反
移碼
- 移碼=真值X+偏置常數,后者通常取2(n-1)(機器字長為n)。
- 在補碼的基礎上將符號位取反,即可得到移碼。
- 移碼常用來表示浮點數的階碼。
5.無符號數的編碼
- 在討論無符號數時,一般情況默認為無符號整數。
- 對于字長相同的情況下,無符號數省略了一位符號位,因此它能表示的最大數比帶符號整數能表示的要大。
- 常用無符號整數進行地址運算,或者用它來表示指針。
- 用權值理解無符號數(無符號數一步得到真值):直接用二進制轉十進制
6.尋址和字節順序
編址方式
按字節編址
- 每一個字節編一個地址
- 假設一個數據32位,就需要分到4個地址
按字長編址
- 每一個存儲字長一個地址
- 假設字長32位,32位的數據一個地址,64位的數據兩個地址
按半字長編址
- 每半個存儲字長一個地址
- 假設字長32位,32位的數據兩個地址,64位的數據四個地址
尋址
無特殊說明,連續字節存儲的數據按照地址低位作為整個數據的地址
字節順序
大端
數據高位存放在地址低位
- 數字12345678分得01 02 03 04四個地址。將12存在01,以此類推。得到12345678.
小端
數據低位存放在地址低位
- 數字12345678分得01 02 03 04四個地址。將12存在04,以此類推。得78563412
7.邊界對齊
K字節的對象的地址必須是K的倍數
例如:
- a和b分別是1字節和4字節。如果不邊界對齊,a分到的地址是00,b分到的地址是01020304。
- 假設計算機的存取字長是4字節,訪問b需要取兩次,。第一次取00010203,第二次04050607,效率低。
- 按照對齊原則,b的地址應該是04050607。這樣就只需一次就取到了b。
8.符號擴展
原碼
- 符號位不變,中間以0擴展
補碼
- 整數:向左擴展,補1
- 小數:向右擴展,補0