第二章資訊的處理和表示 2 整數表示

2021-10-01 22:24:44 字數 3712 閱讀 4474

用位來表示整數有兩種不同的方式:1. 表示非負數 2. 表示負數、零、正數

引入一些數學術語

整型資料型別

c語言支援多種整型資料型別-------表示有限範圍的數。每種型別都能用關鍵字來指定其大小,這些關鍵字 包括char、short、long,同時還可以指示被表示的數字是非負數(宣告為unsigned),或者可能是負數(默 認)

無符號數的編碼

乙個整數資料型別有w位。可以將位向量寫成 x,表示整個向量,或者寫成[xw-1,xw-2,…,x0],表示向 量中的一位。把 x 看做乙個二進位制表示的數,就獲得 x 的無符號表示。用函式b2uw表示,函式b2uw是乙個雙射。

原理:無符號編碼的定義

對向量 x = [xw-1,xw-2,…,x0]:

取值範圍:

1. 最小值是用位向量[00…0]表示,也就是整數0,

2. 最大值是用位向量[11…1]表示,也就是整數值:

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

補碼編碼

最常見的有符號數的計算機表示方式就是補碼的形式。在這個定義中,將字的最高有效位解釋為負權。用函式b2tw表示,函式b2tw是乙個雙射。

原理:補碼編碼的定義

對向量 x = [xw-1,xw-2,…,x0]:

最高有效位xw-1也稱為符號位,"權重"為-2w-1,是無符號表示中權重的負數。符號位設定為1時,表示值為負,而當設定為0時,值為非負。

取值範圍:

最小值的位向量為[10…0],其整數值為tminw=-2w-1

最大值的位向量為[01…1],其整數值為tmaxw=2w-1-1

注意:

在取值範圍內的每個數字都有乙個唯一的w位的補碼編碼,即補碼編碼的唯一性。補碼的範圍時不對稱的:|tmin|=|tmax|+1,即tmin沒有與之對應的正數。之所以有這樣的不對稱性,是因為一半的位模式(符號位為1)表示負數,而另一半(符號位為0)表示非負數。因為0是非負數,因此表示整數的值比表示負數的值少乙個。

最大的無符號數值剛好比補碼的最大值的兩倍大一點:umaxw=2tmaxw+1

有符號數的其他兩種表示方法:

反碼:除了最高有效位的權是-(2w-1-1)而不是-2w-1,它和補碼是一樣的:

原碼:最高有效位的符號位,用來確定剩下的位應該取負權還是正權:

有符號數和無符號數之間的轉換

c語言允許在各種不同的數字資料型別之間轉換。

處理同樣字長的有符號數和無符號數之間相互轉換的規則是:數值可能改變,但是位模式不變。

函式u2bw和t2bw,它們將數值對映為無符號數和補碼形式的位表示。即給定0≤x≤umaxw範圍的乙個整數x,函式u2bw(x)會給出x的唯一的w位無符號表示。相應的,當x滿足tminw≤x≤tmaxw,函式t2bw(x)會給出x的唯一的w位補碼表示

t2uw(x)定義為t2uw(x)=b2uw(t2bw(x))

u2tw(x)定義為u2tw(x)=b2tw(u2bw(x))

補碼和無符號數之間的轉換

補碼轉無符號數

對於滿足tminw≤x≤tmaxw的x有:

無符號數轉補碼

對於滿足0≤x≤umaxw的x有:

c語言中的有符號數和無符號數

c語言支援所有整型資料型別的有符號和無符號運算。大多數機器使用的是補碼,而且都預設為是有符號的,要建立乙個無符號常量,必須加上字尾字元』u』或』u』。允許有符號和無符號之間的轉換,而且,轉換的原則是底層的位表示保持不變。從無符號數向有符號數轉換的時候,用函式u2tw,從有符號數轉無符號數時,用函式t2uw,其中w表示資料型別的位數

型別轉換

顯示強制型別轉換

int tx,ty;

unsigned ux,uy;

tx =

(int

) ux;

uy =

(unsigned

) ty;

隱式型別轉換
int tx,ty;

unsigned ux,uy;

tx = ux;

uy = ty;

當用printf輸出數值時,%d表示有符號十進位制數,%u表示無符號十進位制數,%x表示十六進製制數

由於c語言對同時包含有符號和無符號數表示式的兩種處理方式,因此,當執行乙個運算的時候,如果它的乙個運算數時有符號的而另乙個時無符號的,那麼c語言會隱式地將有符號引數強制型別轉換為無符號數,並假設這兩個數都是非負的,來執行這個運算

擴充套件乙個數字的位表示

乙個常見的運算是在不同字長整數之間轉換,同時又保持數值不變

大的資料型別轉小的資料型別是不可能的

小的資料型別轉大的資料型別是可以的

無符號數的零擴充套件:要將乙個無符號數轉換為乙個更大的資料型別,只需要在表示的開頭新增0.這種運算稱為零擴充套件w

原理:無符號數的零擴充套件

定義寬度為w的位向量 u = [uw-1,uw-2,…,u0]和寬度為w』的位向u』 = [0,…,0,uw-1,uw-2,…,u0],其中w』>w。則b2uw(u) = b2uw』(u』)

補碼數的符號擴充套件:要將乙個補碼數字轉換為乙個更大的資料型別,可以執行乙個符號擴充套件,在表示中新增最高有效位的值

原理:補碼數的符號擴充套件

定義寬度為w的位向量x = [xw-1,xw-2,…,x0]和寬度為w』的位向量 x』=[xw-1,…,xw-1,xw-1,xw-2,…,x0],其中,w』>w。則b2tw(x) = b2tw(x』)

從乙個資料大小到另乙個資料大小的轉換,以及無符號和有符號數字之間的轉換的相對順序能夠影響乙個程式的行為

截斷數字

當將乙個w位的數x = [xw-1,xw-2,…,x0]截斷為乙個k位數字時,我們會丟棄高w-k位,得到乙個位向量x =[xk-1,xk-2,…,x0]。截斷乙個數字可能會改變它的值-----溢位的一種形式。

原理:截斷無符號數

令x等於位向量[xw-1,xw-2,…,x0],而x』是將其截斷為k位的結果:x』 = [xk-1,xk-2,…,x0]。令x = b2uw(x),x』 = b2uk(x』)。則x』 = x mod 2k

原理:截斷補碼數值

令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)

關於有符號數和無符號數的建議

有符號數和無符號數的隱式轉換,會導致錯誤或者漏洞

當我們把字看做是位的集合而沒有任何的數字意義時,無符號數值是非常有用的。例如,往乙個字中放入描述各種布林條件的標記時。位址也是無符號的。實現模運算和多精度運算的數學包時,數字是由字的陣列來表示的,無符號值是非常有用的

第二章 資訊的表示和處理(一)

一 1 當構造儲存和處理資訊的機器時,二進位制值工作得更好。二值訊號能夠容易地被表示 儲存和傳輸。2 位組 編碼非負數 標準字元碼 文件中字母和符號編碼 3 無符號編碼 傳統的二進位制,表示大於零或者等於零的數字 補碼編碼 有符號整數,可以為正也可以為負 浮點數 表示實數的科學計數法的以2未基數的版...

CSAPP筆記 第二章資訊的表示和處理

python 中十六進製制的轉變方法 a 15 print hex a print 0xf 大端法 ibm 和sun microsystems printf 2x 解析 摘自k r c程式語言 點號,用語分隔字段寬度和精度 表示精度的數。對於字串,它指定列印的字元的最大個數 對於e e或f轉換,它指...

CSAPP學習筆記 第二章 資訊的表示和處理

閱讀本章建議 1.反覆閱讀原理描述和它的示例與討論,直到你對該屬性的說明內容及其重要性有了牢固的直覺 2.第一次閱讀可跳過 對於更加複雜的屬性,還會提供推導,其結構看上去將會像乙個數學證明 3.完成練習題 2.1 資訊儲存 1 byte 8 bits 十六進製制表示法 不同進製之間的轉換 字長 指標...