《深入理解計算機系統(tǒng)》第二章 信息的表示和處理

2.1信息存儲

機器程序?qū)?nèi)存視為一個很大的字節(jié)數(shù)組,稱為虛擬內(nèi)存。所有可能的地址集合稱為虛擬地址空間,實際上,該功能的實現(xiàn)是將動態(tài)隨機訪問存儲器(DRAM)、閃存、磁盤存儲器、特殊硬件和操作系統(tǒng)軟件結(jié)合起來,使其看上去是一個統(tǒng)一的字節(jié)數(shù)組。

2.1.1十六進制

十進制轉(zhuǎn)十六進制的方法:如果x是2的非負整數(shù)n次冪,那么把n表示成i+4j的形式,其中0<=i<=3,當i=0時,x的開頭寫成2^i.后面跟j個0。如果沒什么規(guī)律那就整除取余法

2.1.2字數(shù)據(jù)大小

字長指明了指針數(shù)據(jù)的標稱大小,決定了虛擬地址空間的最大大小,如一個字長為w的機器,虛擬地址的范圍就是0~2^w-1 .程序最多訪問2^w個字節(jié).所以經(jīng)過計算,32位的操作系統(tǒng)的內(nèi)存利用的最多只是4G。(這個問題還需要進一步的深究,還沒有理解透徹)

2.1.3尋址和字節(jié)順序

考慮一個w位的整數(shù),其位表示為[x(w-1),x(w-2),......x(1),x(0)],其中的x(w-1)是最高有效位,x(0)表示最低有效位,將這些位轉(zhuǎn)成字節(jié),那么最低有效字節(jié)就是[x(7),x(6)......x(0)]。在內(nèi)存中,最低有效位在前的方式稱為小端法,最高有效位在前的方法稱為大端法。如某個int的值的十六進制是0x01234567的兩種存儲方式如下


image.png

2.1.7位級運算

| & ~ ^ :或、與、非、異或

2.1.8邏輯運算

2.1.9移位運算

左移沒什么好說的
右移運算分為了邏輯右移和算術右移

  • 邏輯右移:在左端補0
  • 算術右移:在左端步最高有效位的值,在處理有符號整數(shù)的時候非常有用,一般默認對有符號整數(shù)采用算數(shù)右移,而對于無符號數(shù),必須是邏輯的
    相比于C,Java有著更加準確的定義,算數(shù)右移:>> 邏輯右移>>>
    移位的k一般是小于等于字長的,如果大于了那一般是經(jīng)過mod字長后進行移位運算

2.2整數(shù)表達

2.2.1整數(shù)數(shù)據(jù)類型

C語言支持多種整數(shù)數(shù)據(jù)類型,每種數(shù)據(jù)類型都用相應的關鍵字來確定大小,而且不同的大小分配的字節(jié)數(shù)根據(jù)編譯為32位還是64未而有所不同,所以整理出下表,下表中的每種類型所表示的數(shù)據(jù)范圍都是計算而來的,而不是記憶的。


32位程序上C語言整型數(shù)據(jù)類型

64位程序上C語言整型數(shù)據(jù)類型

2.2.1無符號數(shù)的編碼

無符號數(shù)的編碼的定義(二進制轉(zhuǎn)無符號數(shù))



無符號數(shù)的二進制表示有一個很重要的屬性,就是每個介于0~2^w-1之間的數(shù)都有唯一一個w位的值編碼。雙射的數(shù)學屬于可以解釋該原理。

2.2.3 補碼編碼

補碼編碼的定義



與我之前的理解有點出入,所以將示例放在了下面



下圖是一些經(jīng)常引用的特殊的值,以作記錄

關于以上的數(shù)字,有以下的注意點

  • 補碼范圍的不對稱
  • 最大的無符號數(shù)值正好比補碼的最大值的兩倍大一點

2.2.4有符號數(shù)和無符號數(shù)之間的轉(zhuǎn)換

對大多數(shù)C語言的實現(xiàn),規(guī)則一般是數(shù)值可能改變,但是位模式不變,
所以經(jīng)過2.1和2.3的轉(zhuǎn)換,補碼轉(zhuǎn)成無符號數(shù)的公式如下



經(jīng)過推導,無符號數(shù)轉(zhuǎn)補碼的公式如下


image.png

2.2.5C語言中有符號位和無符號位

一個有符號、一個無符號,C語言會隱式地將有符號參數(shù)轉(zhuǎn)為無符號參數(shù),所以在進行某些大于或者小于判斷的時候,會有一些非直觀的現(xiàn)象產(chǎn)生。

2.2.6拓展數(shù)字的位表達

從一個較小的數(shù)據(jù)類型轉(zhuǎn)為一個較大的類型,理論上應該保持兩者的相同。所以出現(xiàn)了無符號數(shù)的零擴展和補碼數(shù)的符號擴展

2.2.7截斷數(shù)字

  • 截斷無符號數(shù)
    x截斷為k位的結(jié)果是xmod2^k。 該原理背后的直覺是所有被截去的位權重都是2^i,其中i>=k,所以每一個權在取模之后都變成了零,所以推到得到該結(jié)果
  • 截斷補碼數(shù)值
    x截斷為k位的結(jié)果是U2T(x mod 2^k), 括號中的含義與上述類似,函數(shù)是為了把最高有效位轉(zhuǎn)成-2^(k-1).

2.3整數(shù)運算

2.3.1無符號加法

無符號的加法存在以下的原理



檢測無符號數(shù)加法中的溢出
對于x,y 計算s=x+y,當且僅當s<x(或者s<y)時,發(fā)生了溢出。
無符號數(shù)求反
對于滿足0<=x<2^w 的任意x,其中w位的無符號逆元是以下的公式


2.3.2補碼加法

首先原理如下



檢測補碼加法中的溢出
s=x+y,當且僅當x,y大于零但s小于零時產(chǎn)生了正溢出,而當x,y小于零,但x大于零時,產(chǎn)生了負溢出

2.3.3補碼的非

公式如下,求補碼非得位級表示可以用求反后加一的來快速求得


2.3.4無符號乘法

原理如下


2.3.5補碼乘法

2.3.6乘以常數(shù)

  • 乘以2的冪
    左移一個數(shù)值等價于執(zhí)行一個與2的冪相乘的無符號乘法。
  • 歸納
    同時乘以常數(shù)K的表達可以通過以下的方法進行優(yōu)化,首先,將K的二進制表達成一組0和1交替的序列[(0...0)(1...1)(0...0)]
    可以用下面兩種不同形式中的一種來計算這些位對乘積的影響:考慮一組從位位置n到位位置m的連續(xù)的1(n>=m)
    形式A:(x<<n)+(x<<(n-1))+...(x<<m)
    形式B:(x<<(n+1))-(x<<m)

2.3.7除以2的冪

  • 除以2的冪的無符號除法



    除以2的冪的無符號除法

  • 向下舍入


  • 向上舍入(該處符號有誤)


2.4浮點數(shù)

2.4.1二進制小數(shù)

用最基礎的小數(shù)點右邊的權設為1/2^i 的方法可以近似的描述二進制小數(shù)

2.4.2 IEEE浮點表示

V=(-1)^s* M*2^E
一共三個字段。符號位、整數(shù)位和小數(shù)位


單精度浮點數(shù)的分類
  • 情況1:規(guī)格化的值

  • 情況2:非規(guī)格化的值

  • 情況3:特殊值

以上暫時沒有理解,之后再詳細學習

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容