第二章信息的處理和表示(2.整數表示)

2.整數表示

用位來表示整數有兩種不同的方式:1. 表示非負數 2. 表示負數、零、正數
引入一些數學術語
在這裏插入圖片描述

  1. 整型數據類型
    C語言支持多種整型數據類型-------表示有限範圍的數。每種類型都能用關鍵字來指定其大小,這些關鍵字 包括char、short、long,同時還可以指示被表示的數字是非負數(聲明爲unsigned),或者可能是負數(默 認)
            在這裏插入圖片描述
  2. 無符號數的編碼
    1. 一個整數數據類型有w位。可以將位向量寫成 X,表示整個向量,或者寫成[Xw-1,Xw-2,…,X0],表示向 量中的一位。把 X 看做一個二進制表示的數,就獲得 X 的無符號表示。用函數B2Uw表示,函數B2Uw是一個雙射。

    2. 原理:無符號編碼的定義
      對向量 X = [Xw-1,Xw-2,…,X0]:
               在這裏插入圖片描述

    3. 取值範圍:
      1. 最小值是用位向量[00…0]表示,也就是整數0,
      2. 最大值是用位向量[11…1]表示,也就是整數值:
             在這裏插入圖片描述

      無符號數的二進制表示有一個很重要的屬性,也就是介於0~2w-1之間的數都有唯一一個w位的值編碼,即無符號數編碼的唯一性

  3. 補碼編碼
    1. 最常見的有符號數的計算機表示方式就是補碼的形式。在這個定義中,將字的最高有效位解釋爲負權。用函數B2TW表示,函數B2TW是一個雙射。
    2. 原理:補碼編碼的定義
      對向量 X = [Xw-1,Xw-2,…,X0]:
             在這裏插入圖片描述
      最高有效位Xw-1也稱爲符號位,"權重"爲-2w-1,是無符號表示中權重的負數。符號位設置爲1時,表示值爲負,而當設置爲0時,值爲非負。
    3. 取值範圍:
      1. 最小值的位向量爲[10…0],其整數值爲TMinw=-2W-1
      2. 最大值的位向量爲[01…1],其整數值爲TMaxw=2W-1-1
    4. 注意:
      1. 在取值範圍內的每個數字都有一個唯一的w位的補碼編碼,即補碼編碼的唯一性。補碼的範圍時不對稱的:|TMin|=|TMax|+1,即TMin沒有與之對應的正數。之所以有這樣的不對稱性,是因爲一半的位模式(符號位爲1)表示負數,而另一半(符號位爲0)表示非負數。因爲0是非負數,因此表示整數的值比表示負數的值少一個。
      2. 最大的無符號數值剛好比補碼的最大值的兩倍大一點:UMaxW=2TMaxW+1
    5. 有符號數的其他兩種表示方法:
      反碼:除了最高有效位的權是-(2w-1-1)而不是-2w-1,它和補碼是一樣的:
          在這裏插入圖片描述
      原碼:最高有效位的符號位,用來確定剩下的位應該取負權還是正權:
          在這裏插入圖片描述
  4. 有符號數和無符號數之間的轉換
      C語言允許在各種不同的數字數據類型之間轉換。
    1. 處理同樣字長的有符號數和無符號數之間相互轉換的規則是:數值可能改變,但是位模式不變。
    2. 函數U2BW和T2BW,它們將數值映射爲無符號數和補碼形式的位表示。即給定0≤X≤UMaxW範圍的一個整數x,函數U2BW(X)會給出x的唯一的w位無符號表示。相應的,當x滿足TMinW≤X≤TmaxW,函數T2BW(X)會給出x的唯一的w位補碼錶示
    3. T2UW(X)定義爲T2UW(X)=B2UW(T2BW(X))
      U2TW(X)定義爲U2TW(X)=B2TW(U2BW(X))
    4. 補碼和無符號數之間的轉換
      1. 補碼轉無符號數
        對於滿足TMinW≤X≤TmaxW的x有:
        在這裏插入圖片描述
        在這裏插入圖片描述
      2. 無符號數轉補碼
        對於滿足0≤x≤UMaxW的x有:
        在這裏插入圖片描述
        在這裏插入圖片描述
  5. C語言中的有符號數和無符號數
    1. C語言支持所有整型數據類型的有符號和無符號運算。大多數機器使用的是補碼,而且都默認爲是有符號的,要創建一個無符號常量,必須加上後綴字符’U’或’u’。允許有符號和無符號之間的轉換,而且,轉換的原則是底層的位表示保持不變。從無符號數向有符號數轉換的時候,用函數U2Tw,從有符號數轉無符號數時,用函數T2Uw,其中w表示數據類型的位數
    2. 類型轉換
      1. 顯示強制類型轉換
        	int tx,ty;
        	unsigned ux,uy;
        	tx = (int) ux;
        	uy = (unsigned) ty;
        
      2. 隱式類型轉換
        	int tx,ty;
        	unsigned ux,uy;
        	tx =  ux;
        	uy = ty;
        
    3. 當用printf輸出數值時,%d表示有符號十進制數,%u表示無符號十進制數,%x表示十六進制數
    4. 由於C語言對同時包含有符號和無符號數表達式的兩種處理方式,因此,當執行一個運算的時候,如果它的一個運算數時有符號的而另一個時無符號的,那麼C語言會隱式地將有符號參數強制類型轉換爲無符號數,並假設這兩個數都是非負的,來執行這個運算
  6. 擴展一個數字的位表示
    1. 一個常見的運算是在不同字長整數之間轉換,同時又保持數值不變
      1. 大的數據類型轉小的數據類型是不可能的
      2. 小的數據類型轉大的數據類型是可以的
    2. 無符號數的零擴展:要將一個無符號數轉換爲一個更大的數據類型,只需要在表示的開頭添加0.這種運算稱爲零擴展w
      原理:無符號數的零擴展
      定義寬度爲w的位向量 U = [UW-1,UW-2,…,U0]和寬度爲w’的位向U’ = [0,…,0,UW-1,UW-2,…,U0],其中w’>w。則B2UW(U) = B2UW’(U’)
    3. 補碼數的符號擴展:要將一個補碼數字轉換爲一個更大的數據類型,可以執行一個符號擴展,在表示中添加最高有效位的值
      原理:補碼數的符號擴展
      定義寬度爲w的位向量X = [XW-1,XW-2,…,X0]和寬度爲W’的位向量 X’=[XW-1,…,XW-1,XW-1,XW-2,…,X0],其中,W’>W。則B2TW(X) = B2TW(X’)
    4. 從一個數據大小到另一個數據大小的轉換,以及無符號和有符號數字之間的轉換的相對順序能夠影響一個程序的行爲
  7. 截斷數字
    當將一個w位的數X = [XW-1,XW-2,…,X0]截斷爲一個k位數字時,我們會丟棄高w-k位,得到一個位向量X =[XK-1,XK-2,…,X0]。截斷一個數字可能會改變它的值-----溢出的一種形式。
    1. 原理:截斷無符號數
      令X等於位向量[XW-1,XW-2,…,X0],而X’是將其截斷爲k位的結果:X’ = [XK-1,XK-2,…,X0]。令X = B2UW(X),X’ = B2UK(X’)。則X’ = X mod 2k
    2. 原理:截斷補碼數值
      令X等於位向量[XW-1,XW-2,…,X0],而X’是將其截斷爲k位的結果:X’ = [XK-1,XK-2,…,X0]。令X = B2UW(X),X’ = B2TK(X’)。則X’ = U2TK(X mod 2k)
  8. 關於有符號數和無符號數的建議
    有符號數和無符號數的隱式轉換,會導致錯誤或者漏洞
    當我們把字看做是位的集合而沒有任何的數字意義時,無符號數值是非常有用的。例如,往一個字中放入描述各種布爾條件的標記時。地址也是無符號的。實現模運算和多精度運算的數學包時,數字是由字的數組來表示的,無符號值是非常有用的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章