1. 程式人生 > >C - 有符號數和無符號數擴充套件

C - 有符號數和無符號數擴充套件

C語言標準要求先進行資料大小的轉換,之後再進行無符號和有符號之間的轉換. C語言中的強制型別轉換保持二進位制位值不變,只是改變解釋位的方式。

將無符號數轉換為更大的資料型別時, 只需簡單地在開頭新增0,這種運算稱為0擴充套件。將有符號數轉換為更大的資料型別需要執行符號擴充套件,規則是將符號位擴充套件至所需要的位數。擴充套件的原則是:

  • 有符號的資料型別,在向高精度擴充套件時,總是帶符號擴充套件
  • 無符號的資料型別,在向高精度擴充套件時,總是無符號擴充套件

將一個大的資料型別轉換為小的資料型別時,不管是無符號數還是有符號數都是簡單地進行位截斷。無符號數的數值大小可能因截斷而變化,而有符號數不僅數值大小可能變化,符號位也可能發生改變,如8位二進位制數00011001(25)轉換為4位數截斷的結果是1001(-7).


在C語言中,如果一個運算包含一個有符號數和一個無符號數,那麼C語言會隱式地將有符號數轉換為無符號數。而在組合語言層面,宣告變數的時候,沒有 signed 和 unsigned 之分,彙編器統統將輸入的整數字面量當作有符號數處理成補碼存入到計算機中。