《深刻理解計算機系統》2——信息編碼

      計算機中數字的主要表示方式有無符號數,補碼數和浮點數三種。計算機中最小可尋址單位爲8位的塊,或者稱爲字節。機器級程序將存儲器視爲一個很是大的字節數組,稱爲虛擬存儲器,虛擬存儲器中每一個字節由惟一的數字來標識:地址,全部可能地址空間的集合稱爲虛擬地址空間。64位機器和32位機器主要的不一樣是:指針用8字節表示,long int用8字節表示,32位中都爲4字節。另外,不一樣的機器尋址的字節順序不一樣,intel是小端,IBM和sum是大端,小端大端對於機器級程序員是不可見的,不過網絡通信時須要考慮信息轉換。程序員

      字符串編碼是以null字符結尾的字符數組。ascii碼的字符串不存在字節順序的問題。於是文本數據比二進制數據更通用。數組

      c語言提供了邏輯運算,移位運算等位級操做,這些操做比一般意義上的邏輯運算,算術運算快速的多。注意右移運算分邏輯右移和算術右移兩種:前者簡單的在左邊填充0,後者在左邊填充最高位,算術右移是很是有用的,由於在補碼數中,算術右移具備保符號,保正確性。網絡

       整數的無符號數編碼最簡單,略去不說。編碼

       整數的補碼編碼是針對應用中須要表示負數的情形,採用補碼有三個緣由:一是一一對應,二是容易實現移位操做,三是x的加法逆元就是-x。這種狀況下,字的最高有效位解釋爲負權。其餘位和無符號數編碼一致。有符號數到無符號數的隱式強制轉換(位不變,解釋方式改變)會致使一些特殊的程序錯誤(好比負數被解釋爲大的整數,致使數組溢出),所以不建議使用無符號數。spa

        整數的加法運算一般會出現溢出。補碼錶示中,可能出現正溢出或者負溢出。判斷方法是異號加法不會產生溢出,同號運算結果的絕對值必須大於這兩個元素任一的絕對值。減法與逆元相對應,乘法與移位操做相對應,除法比較複雜。指針

        浮點數的編碼很複雜,目前應用較普遍的是IEEE754標準,這是一個優雅而細緻的標準。標準以V=(-1)^S*M*2^E 表示一個數。S是符號位,決定數字的正負,1位表示;E是階碼字段的編碼,8位或11位表示;M是尾數,範圍是0~1-t或者1-2-t,23位或52位表示,共32位或64位(單雙精度浮點數:float,double)。根據E的取值範圍,被編碼的值分爲規格化的(階碼非全0也非全1),非規格化的(階碼全0),無窮大(階碼全1)。規格化的值是最廣泛的狀況,此時階碼E字段被解釋爲以偏置形式表示的有符號數。偏置值爲127或1023,階碼值=E-偏置值,故指數取值範圍爲-126~127或-1022~1023.小數值部分解釋爲0.fn-1fn-2...f0,即最高位定義在最高有效位的左邊。尾數定義爲1+f,取值範圍爲1~2。非規格化數是第二種狀況,這種狀況下階碼值E=1-偏置值,尾數值M=f,也就是小數字段的值,不包含隱含的開頭的1,非規格化數有兩個用途:一是用來表示0,事實上0的編碼時全0;另一個功能是表示那些很是接近0.0的數字,它們提供一種屬性,稱爲逐漸溢出,其中,可能的數值分佈均勻接近於0.0。最後一種狀況是無窮大。ci

       由於表示方法限制了浮點數的精度和範圍,浮點運算只能近似的表示實數運算,咱們但願在計算的過程當中能系統的找到能表示的最接近於計算結果的匹配值,這就是舍入計算的任務了。IEEE754浮點數默認是向偶數舍入。具體的浮點運算後面再介紹。字符串

相關文章
相關標籤/搜索