读书笔记 -《深入理解计算机系统》2.1
1、進制
????? 計算機作為一種電子計算工具,是由大量的電子器件組成的,在這些電子器件中,電路的通和斷、電位的高和低,用兩個數(shù)字符號“1”和“0”分別表示容易實現(xiàn)。同時二進制的運算法則也很簡單,因此,在計算機內(nèi)部通常用二進制代碼來作為內(nèi)部存儲、傳輸和處理數(shù)據(jù)。
????? 但是用二進制數(shù)表示一個數(shù)值時,位數(shù)比較長,不便書寫和記憶,而用于十進制雖然看起來很方便但是與位模式之間的轉(zhuǎn)換卻十分的麻煩。因此,使用十六進制來書寫位模式。
????? 下圖為二進制、十進制、十六進制的轉(zhuǎn)換表:
??????
2、單位
字節(jié)(byte):用于計量存儲容量和傳輸容量的最小的可存儲器單位,1個字節(jié)等于8位二進制。
?
單位的換算:
????? 1字節(jié)(Byte)= 8位(bit)
????? 1024字節(jié) = 1KB(2^10字節(jié))
????? 1024KB = 1MB(2^20字節(jié))
????? 1024MB = 1GB(2^30字節(jié))
????? 1GB = 1TB(2^40字節(jié))
3、字長
????? 在同一時間中處理二進制數(shù)的位數(shù)叫字長。通常稱處理字長為8位數(shù)據(jù)的CPU叫8位CPU,32位CPU就是在同一時間內(nèi)處理字長為32位的二進制數(shù)據(jù)。二進制的每一個0或1是組成二進制的最小單位,稱為一個比特(bit).
字長:一般說來,計算機在同一時間內(nèi)處理的一組二進制數(shù)稱為一個計算機的“字”,而這組二進制數(shù)的位數(shù)就是“字長”。在其他指標相同時,字長越大計算機的處理數(shù)據(jù)的速度就越快。早期的微機字長一般是8位和16位,386以及更高的處理器大多是32位。目前市面上的計算機的處理器大部分已達到64位。更多信息查看
? 4、字節(jié)順序
由來:
????? 我們在寫字符流時,因為字符型只占一個字節(jié)數(shù),計算機只須按一個字符一個字符寫入文件即可。但是如果是處理整型時,由于整型占4個字節(jié),所以一個整型內(nèi)部的字節(jié)存儲排列的順序直接關(guān)系到被計算機識別出來的整型值。某種意義上也可直接理解計算機的識別順序就是所謂的字節(jié)順序。
????? 字節(jié)序主要分為:大端法(通常為網(wǎng)絡(luò)字節(jié)序)、小端法(通常為主機字節(jié)順序)
?
????? 1、小端法(Little-Endian)就是低位字節(jié)排放在內(nèi)存的低地址端即該值的起始地址,高位字節(jié)排放在內(nèi)存的高地址端。
????? 2、大端法(Big-Endian)就是高位字節(jié)排放在內(nèi)存的低地址端即該值的起始地址,低位字節(jié)排放在內(nèi)存的高地址端。
舉個簡單的例子,對于整形0x12345678。它在大端法和小端法的系統(tǒng)內(nèi)中,分別如圖1所示的方式存放。
?5、原碼,反碼,補碼
????? 數(shù)值有正負之分,計算機就用一個數(shù)的最高位存放符號(0為正,1為負).這就是機器數(shù)的原碼了.假設(shè)機器能處理的位數(shù)為8.即字長為1byte,原碼能表示數(shù)值的范圍為(-127~-0 +0~127)共256個.(注:-0將由下面解釋)?
????? 有了數(shù)值的表示方法就可以對數(shù)進行算術(shù)運算.但是很快就發(fā)現(xiàn)用帶符號位的原碼進行乘除運算時結(jié)果正確,而在加減運算的時候就出現(xiàn)了問題,如下: 假設(shè)字長為8bits
????? (1) 10 - (1)10 = (1)10 + (-1)10 = (0)10
????? (0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 ) 顯然不正確。
????? 因為在兩個整數(shù)的加法運算中是沒有問題的,于是就發(fā)現(xiàn)問題出現(xiàn)在帶符號位的負數(shù)身上。對除符號位外的其余各位逐位取反就產(chǎn)生了反碼。反碼的取值空間和原碼相同且一一對應(yīng)。下面是反碼的減法運算:
????? (1)10 - (1)10 = (1)10 + (-1)10 = (0)10
????? (0 0000001)反 + (1 1111110)反 = (1 1111111)反 = ( -0 ) 有問題。
????? (1)10 - (2)10 = (1)10 + (-2)10 = (-1)10
????? (0 0000001)反 + (1 1111101)反 = (11111110)反 = (-1) 正確。
????? 問題出現(xiàn)在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的。(印度人首先將零作為標記并放入運算之中,包含有零號的印度數(shù)學和十進制計數(shù)對人類文明的貢獻極大)。
????? 于是就引入了補碼概念。負數(shù)的補碼就是對反碼加一,而正數(shù)的補碼不變,正數(shù)的原碼反碼補碼是一樣的。在補碼中用(-128)代替了(-0),這個是人為規(guī)定的,所以補碼的表示范圍為:
????? (-128~0~127)共256個。
????? 注意:(-128)沒有相對應(yīng)的原碼和反碼, (-128) = (1 0000000)? 補碼的加減運算如下:
????? (1)10 - (1)10 = (1)10 + (-1)10 = (0)10
????? (0 0000001)補 + (1 1111111)補 = (0 0000000)補 = ( 0 ) 正確。
????? (1)10 - (2)10 = (1)10 + (-2)10 = (-1)10
????? (00000001)補 + (11111110)補 = (11111111)補 = (-1) 正確。
????? 所以補碼的設(shè)計目的是:
???? (1)使符號位能與有效值部分一起參加運算,從而簡化運算規(guī)則。補碼機器數(shù)中的符號位,并不是強加上去的,是數(shù)據(jù)本身的自然組成部分,可以正常地參與運算。
???? (2) 使減法運算轉(zhuǎn)換為加法運算,進一步簡化計算機中運算器的線路設(shè)計。
所有這些轉(zhuǎn)換都是在計算機的最底層進行的,而在我們使用的匯編、c等其他高級語言中使用的都是原碼。
轉(zhuǎn)載于:https://www.cnblogs.com/BoyceLin/archive/2010/06/08/1754060.html
總結(jié)
以上是生活随笔為你收集整理的读书笔记 -《深入理解计算机系统》2.1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [翻译]load-on-startup
- 下一篇: 助你打造纯键盘流系统——Launchy