天天看點

資訊安全系統設計基礎第三周學習總結

第二章

2.1資訊存儲

1、數字的三種表示

無符号數:傳統的二進制表示法,表示大于或等于零的數字 補碼:表示有符号數,可為正可為負的數字 浮點數:實數的科學計數法的以二為基數的版本 整數運算和浮點數運算會有不同的數學屬性。 原因:處理數字表示有限性的方式不同 整數表示:編碼的數值範圍相對較小,但精确  浮點數表示:編碼的數值範圍相對較大,但是近似的 計算機運算的漏洞多由于計算機算數運算的微秒細節引發的

2、進制轉化

(1)x=2^n轉化為十六進制

将x寫成x=2^n的形式,令n=i+4j,x的十六進制表示為:開頭為2^i的值,後面補j個0。

(2)十進制轉化為十六進制

十進制數x反複除以16,得十六進制數

(3)十六進制轉化為十進制

十六進制數x反複乘以16,得十進制數

3、字和位元組順序

字長:一個字長指明整數和指針資料的标稱大小。字長決定最重要的系統參數就是虛拟位址空間的最大大小。對一個字長為w位的機器而言,虛拟位址的範圍是0~2^w-1,程式最多通路2^w個位元組。  對于跨越多位元組的程式對象需建立兩個規則:  這個對象的位址是什麼,以及在存儲器中如何排列這些位元組。  小端法:高對高,低對低  大端法:從視覺上,是這次閱讀的順序,與小端法相反。 使位元組順序變得可見的三種方式: 不同類型的機器之間通過網絡傳送二進制資料時,網絡應用程式的代碼編寫必須遵守已建立的關于位元組順序的規則;使用反彙編器,處理整數資料的位元組序列的存儲位元組順序問題;當編寫規避正常的類型系統的程式時。

4、布爾代數

(1)位向量的運算:按位運算

(2)位向量的應用:表示有限集合

掩碼表示的是設定為有效信号的集合。

(3)位級運算

|:或  &:與  ~:取反  ^:異或  确定一個位級表達式的結果的最好的方法就是:将十六進制的參數擴充成二進制表示并執行二進制運算,然後在轉換為十六進制。 w 位級運算的常用算法:掩碼運算。  掩碼運算:掩碼是一個位模式,表示從一個字中選出的位的集合。例如:位級運算x&0xFF生成一個有x的最低有效位元組組成的值。表達式~0将生成一個全1的掩碼,不管機器的字大小是多少。

(4)邏輯運算

邏輯運算符:||(或)、&&(與)、!(非)  邏輯運算認為所有非零的參數都表示TRUE,參數0表示FALSE。傳回1或者0,分别表示結果為TRUE或FALSE。  邏輯運算和位級運算的差別是:  按位運算隻有在特殊情況下,即參數被限制為0或者1時,才能與其對應的邏輯運算有相同的行為; 若第一個參數求值就能确定表達式的結果,那麼邏輯運算符就不會對第二個參數求值。

(5)移位運算

左移k位:丢棄最高位的k位,右端補k個0  右移包括:邏輯右移、算數右移  邏輯右移:左端補k個0(常用于無符号數)  算數右移:左端補k個最高有效位的值(用于有符号數)

2.2整數表示

1、補碼編碼

補碼形式是最常見的有符号數的計算機表示方式  将字的最高有效位解釋為負權 B2T(W)函數為:B2T(x) = -x(w-1)2^(w-1)+∑xi2^i(求和從i=0到i=w-2)

2、有符号數和無符号數之間的轉換

處理同樣字長的有符号數和無符号數之間互相轉換的一般規則:數值可能會改變,但是位模式不變。  c語言允許無符号數和有符号數之間的轉換。轉換的原則是底層的位表示不變。  當從無符号數轉換為有符号數是,效果是應用函數U2T,從有符号數轉化為無符号數時,應用函數T2U,其中w表示資料類型的位數。 負數和正數相等的情況:u=2147483648 =-2147483648  (當輸出分别為無符号形式和有符号形式時)

3、擴充數的位表示

零擴充:将無符号數轉換為更大的數在表示的開頭添加0  符号擴充:将一個補碼數字轉換為一個更大的資料類型

4、截斷數字

截斷數字:不用額外的位來擴充一個數值,而是減少表示一個數字的位數。

5、使用無符号數的情況

(1)把字僅僅看做是位的集合,并沒有任何數字意義時 (2)當實作模運算和多精度運算的數學包時,數字是由數的數組來表示的,無符号值也會非常有用。

2.3整數運算

1.無符号加法

無符号運算可以被視為一種模運算形式,無符号加法等同于計算和摸上2^w,可以通過簡單的丢棄x+y的w+1位表示的最高位,來計算這個數值。  一個算數運算的溢出,是指完整的整數結果不能放到資料類型的字長限制中去。

2.補碼加法

兩個數的w位補碼之和與無符号之和有完全相同的位級表示。大多數計算機用相同的機器指令來執行無符号或者有符号加法。  有符号加法的結果z=x+y可分為4種情況:  (1)-2^(w)≤z<-2^(w-1):兩個負數相加得一個非負的結果。  (2)-2^(w-1)≤z<0:結果正常,z為負數  (3)0≤z<2^(w-1):結果正常,z為正數 (4)2^(w-1)≤z<2^(w):兩個正數相加得一個負數的結果。

3.補碼的非

對于範圍-2^(w-1)≤x<-2^(w-1)内的x,補碼的非運算如下: (1)x=-2^(w-1):補碼的非為-2^(w-1); (2)x>-2^(w-1):補碼的非為-x。  求位級補碼非的方法:  (1)對每一位求補,再對結果加1;(2)建立在将位向量分為兩部分的基礎之上的。

4.無符号乘法

兩個數x、y相乘且x、y的位數為w,則結果的位數為2w。

5.補碼乘法

同無符号乘法。 若為截斷後的結果,則取結果的後w位作為計算結果。 注意:無符号運算和補碼運算在“+”、“-”、“*”在位級上有相同的結果。

6.乘以常數

對于某個常數K的表達式x*K生成代碼,編譯器會将K的二進制表示表達為一組0或1的交替的序列: [(0…0)(1…1)(0…0)…(1…1)]  可以用以下兩種形式來計算這些乘積的結果:  A:(x<<n)+(x<<n-1)+……+(x<<m)  B:(x<<n+1)-(x<<m)

7.除以2的幂

設x/K,令K=2^n, 當x為正數時,計算 x>>n;  當x為負數時,将x加上偏置量,即加上2^n-1(即K-1),計算** (x+偏置量)>>n**。

8.關于整數運算的最後思考

計算機執行的“整數”運算實際上是一種模運算形式;  表示數字的有限字長限制來了可能的值的取值範圍,運算結果可能溢出; 補碼表示提供了一種即能表示負數也能表示正數的靈活方法,同時使用了與執行無符号算術相同的位級實作;  c語言中的unsigned資料類型的使用也應當特别注意,比如,在書寫整數常數和調用庫函數的時候。

2.4浮點數

(1)二進制小數

将十進制小數轉換為二進制小數  首先,将十進制小數寫成分數的形式,将分數的分子部分,寫成二進制的形式;将分數的分母部分寫成2^n的形式,将分子的二進制形式,從右往左數,數n位添加小數點。 小數點左移:除以2  小數點右移:乘以2

(2)IEEE浮點數表示

表示形式為:V = (-1)^s * M * 2^E  符号:s決定這個數是負數(s = 1)還是正數(s = 0),而對于數值0的符号位解釋作為特殊情況處理。  尾數:M是一個二進制小數,它的範圍是1 ~ 2-ε,或者是0 ~ 1-ε。  階碼:E的作用是對浮點資料權重,這個權重是2的E次幂(可能是負數)。  根據階碼的值,可分為一下三種情況:  情況一:規格化的值 (當階碼字段不全為0或

(3)浮點數的舍入

有四種情況分别是:向偶數舍入(預設)、向零舍入、向下舍入、向上舍入。

(4)浮點運算

浮點加法:不滿足結合性、滿足單調性  浮點乘法:不滿足結合性、滿足單調性,在加法上不滿足配置設定性

全為1時) E = e-Bias Bias = 2^(k-1)-1  M = 1+f