第一次寫博客,沒什么經驗,會保持更新的,文章也會不斷優化的,請大家多多指教
整數表示
現代計算機存儲和處理的信息以二值表示,也即是只包含0和一的二進制數字,其中整數表示的方法分為有符號整數、無符號整數。常用的數字表示方法有二進制、十進制、八進制、十六進制。下表為十六進制、十進制、和二進制的對應表示法。
十六進制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
十進制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
二進制 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
無符號整數
B2U() 為將二進制數轉換為無符號數的函數
B2U[0001] = 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 1;
B2U[0101] = 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 5;
B2U[0001] = 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 1;
B2U[0001] = 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 1;
設計算機為w位(上為4位,現在計算機一般為64位),則可以表示最大無符號整數為:(2^w - 1),最小為:0;
有符號整數
B2T[0001] = 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 1;
B2T[0101] = 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 5;
B2T[1011] = -1 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = -5;
B2T[1111] = -1 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = -1;
設計算機為w位(上為4位,現在計算機一般為64位),則可以表示最大無符號整數為:(2^(w-1) - 1),最小為:(-2^(w-1));
浮點數表示
二進制小數
以下為個人理解,先舉個例子:
十進制表示 | 小數值 | 二進制表示 |
---|---|---|
1 | 1 | 000001 |
0.5 | 1/2 | 00000.1 |
0.25 | 1/4 | 0000.01 |
0.125 | 1/8 | 000.001 |
0.75 | 3/4 | 0000.11 |
1.5625 | 25/16 | 01.1001 |
∉εεεεεεεε
仔細看就會返現一個規律:
1的二進制表示為:000001,除以8,即2^3
3的二進制表示為:000011,除以4,即2^2
25的二進制表示為:011001,除以16,即2^4
沒錯,整數減少一倍,二進制中小數點右移一位,如果整數增加一倍,則二進制中小數左移一位
IEEE浮點表示
目前所有的計算機都支持的表示浮點數的標准
V = (-1)^s * M * 2^E
- 數值(value)V
- 符號(sign)s決定這數是負數(s = 1)還是正數(s = 0),而對於數值0的符號位解釋作為特殊情況處理。
- 尾數(significand)M是一個二進制小數,他的范圍是1(2-ε),或者是0(1-ε)。
- 階碼(exponent)E的作用是對浮點數加權,這個權重是2的E次冪(可能是負數)。
將浮點數的位划分為三個字段,分別對這些值進行編碼: - 一個單獨的符號位s直接編碼符號s。
- k位的階碼字段exp = e(k-1) + ... + e(0)編碼階碼E
- n位小數字段frac = f(n-1) + ... + f(0)編碼尾數M,但是編碼出來的值也依賴於階碼字段的值是否等於0。
最常見的單精度浮點格式float32位:s 1位,exp k=8位,frac n = 23位。
雙精度浮點格式double:s 1位, exp k = 11位,frac n = 52位。