天天看點

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

資訊的表示和處理

通過使用标準的字元碼能夠對文檔中的字母和符号進行編碼。

三種重要的數字表現形式:

1、  無符号數:編碼基于傳統的二進制表示法表示大于或等于零的數字。

2、  補碼:編碼是表示有符号整數的最常見方法,可以是正或者是負的數字。

3、  浮點數:編碼是表示實數的科學計數法的以二位基數的版本

溢出:計算機的表示法是用有限數量的位來為一個數字編碼,是以當結果太大就會導緻某些運算溢出。

整數和浮點數會有不同的數學屬性是因為:處理數字表示有限性的方法不同:

      整數:編碼相對較小的數值範圍,但精确度高

      浮點數:編碼較大範圍的數,但這種表示是近似的

2.1資訊存儲

編寫機器級程式的常見任務就是在位模式的十進制、二進制、十六進制之間人工的進行進制轉換。

1.  十六進制表示法:我會。

2.  字: 字長:指明整數和指針資料的标稱大小。字長決定最重要的系統參數就是虛拟位址空間的最大大小。

3.  資料大小:電腦和編譯器支援不同方式編碼的數字格式,也具有處理單個位元組的指令或2位元組,4位元組,8位元組整數的指令。

4.  尋址和位元組順序:最高有效位前八位和最低有效位後八位。是網絡程式設計基礎

小端法:某些機器選擇在存儲器中按最低有效位元組到最高有效位元組

大端法:某些機器選擇在存儲器中按最高有效位元組到最低有效位元組

小端法“高對高,低對低”大端與之相反。

5.  表示字元串:文本資料比二進制資料具有更強的獨立性

6.  布爾代數:二進制是計算機編碼存儲和操作資訊的核心。數電裡學過布爾運算。我會。

7.  C語言中的位級運算:C語言支援按位的布爾運算。與或非,異或同或

常見用法就是實作掩碼運算。

8.  C語言中的邏輯運算:&&與。||或。!非。

9.  C語言中的移位運算:x<<k:左移k位。X>>k:右移

2.2整數表示

1.整型資料類型:根據位元組配置設定,不同的大小所能表示的值的範圍不同。C

   C 和C++預設支援有符号數和無符号數,Java隻支援有符号數。

2.無符号數的編碼:B2U4([0001])=0*2^3+0*2^2+0*2^1+1*2^0=1

3.補碼編碼:B2T4([1011])=-1*2^3+0*2^2+1*2^1+1*2^0=-5

   最高位有效位也稱符号位,權重為-2^w-1。符号位為1是負為0是正。

   補碼的範圍不對稱,是因為:一半的數的整數一半是負數,而0是非負數。最大的無符号數值剛好比補碼的最大值的兩倍大一點。

4.有符号數和無符号數之間的轉換:

5.C語言中的有符号數和無符号數:預設有符号,若想建立無符号常量必須加字尾U/u。

   C語言轉換的原則是底層的位保持不變。無到有:U2TW。有到無:T2UW

6.擴充一個數字的位表示:在不同字長的整數之間轉換又保持數值不變。

   0擴充:簡單的在表示的開頭加0。

   符号擴充:将補碼數字轉換成更大類型的資料。規則在表中添加最高有效位的值的副本。

7.截斷數字:減少表示一個數字的位數。

2.3整數運算

1.無符号加法:可以被視為模運算形式,等價于計算和模2^w。在我的了解看來應該就是跟溢出差不多的性質。運算的溢出是指完整的整數結果不能存放到資料類型的字長限制中。

2.補碼加法:負溢出得到的結果比整數和大16,正溢出得到的結果比整數小16.

3.補碼的非&4.無符号乘法計算公式看書。

5.補碼乘法:給定長度的兩個為位向量,無符号乘積的位級與補碼乘積的位級表示是相同的,表明及其可以用一種乘法指令來進行有符号數和無符号數的乘法。無符号和補碼乘積的低位是相同的

6.乘以常數:為了縮短計算時間,試着用移位和加法運算的組合來代替乘以常數的乘法。推理過程看書。

7除以2的幂:除法比乘法的計算時間更長。除以2 的幂用右移而不是左移。同樣推理過程仔細閱讀書上的内容。

8.關于整數運算:整數運算實際是一種模運算。表示數字的有限字長限制了可能的取值範圍,結果可能溢出。補碼提供了技能表示正數也能表示負數的靈活方法,同時使用了與執行無符号算數相同的位級實作。

2.4浮點數

1.二進制小數:

與十進制小數類似,會轉換就行。二進制小數點向左移動一位相當于這個小數被2除,向右移動一位相當于該數乘以2。

2.IEEE浮點表示:标準 V=(-1)^s*M*2^E

   其中:

        符号:s  決定這個數是正數還是負數。

        尾數:M 二進制小數。

        階碼:E  對浮點數權重,權重是2 的E次幂。

   将浮點數的位劃分成三段分别進行編碼:

        一個單獨的符号位直接編碼符号。

        K位的階碼字段exp=ek-1……e1e0編碼階段

        N位小數字段

情況1:規格化的值。當exp的為模不全為1或0。階碼字段被解釋為以偏置形式表示有符号整數。

情況2:非規格化的值:階碼域全為0。用途:提供了一種表示數值0的方法。表示非常接近于0.0的數。

情況3:特殊值:階碼域全為1。小數域全為0,得到的值表示無窮。在表示未初始化的資料時也很有用。

3.數字示例:k位階碼和n位小數的浮點表示的一般屬性:

   值+0.0總有一個全為0的位表示。

   最小的正非規格化值的位表示,是由最低位為1而其他位為0構成的

   最大的非規格化值的位表示,是由全為0的階段字碼和全為1的小數字段組成

   最小的正規格化值的位表示,是由最低位為1而其他位為0構成的。

   值1.0的位表示的階碼字段除了最高有效位等于0以外其他位為1.

   最大的規格化值的位表示,符号位為0階碼的最低有效位為0,其他位為1.

4.舍入:浮點運算隻能近似的表示示數運算想要找到最接近x的值就是舍入,問題的關鍵在于在兩個可能的值中間确定舍入方向。

   a.向偶數舍入:也叫向最接近的值舍入。是預設方法。将數字向上或向下舍入使的結果的最低有效數字是偶數。其他三種方式産生實際值的确界。

5.浮點運算:IEEE的優勢可以獨立于任何具體的硬體或軟體實作。

   浮點加法不具有結合性但滿足了單調性屬性。

小結

計算機将資訊按位編碼,通常組織成位元組序列。用不同的編碼方式表示整數、實數和字元串。不同的計算機模型在編碼數字和多位元組資料中的位元組排序時使用不同的約定。

C語言的設計可以包容多種不同字長和數字編碼的實作。雖然高端機器逐漸開始使用64位字長,但是目前大多數機器仍使用32位字長。大多數機器對整數使用補碼編碼,而對浮點數使用IEEE浮點編碼。在位級上了解這些編碼,并且了解算術運算的數學特性,對于想使編寫的程式能在全部數值範圍上正确運算的程式員來說,是很重要的。

在相同長度的無符号和有符号整數之間進行強制類型轉換時,大多數C語言實作遵循的原則是底層的位模式不變。在補碼機器上,對于一個w位的值,這種行為是由函數T2Uw和U2Tw來描述的。C語言隐式的強制類型轉換會出現許多程式員無法預計的結果,常常導緻程式錯誤。

由于編碼的長度有限,與傳統整數和實數運算相比,計算機運算具有完全不同的屬性。當超出表示範圍時,有限長度能夠引起數值溢出。當浮點數非常接近于0.0,進而轉換成零時,也會下溢。

和大多數其他程式語言一樣,C語言實作的有限整數運算和真實的整數運算相比,有一些特殊的屬性。例如,由于溢出,表達式x*x能夠得出負數。但是,無符号數和補碼的運算都滿足整數運算的許多其他屬性,包括結合律、交換律和配置設定律。這就允許編譯器做很多的優化。例如,用(x<<3)-x取代表達式7*x時,我們就利用了結合律、交換律和配置設定律的屬性,還利用了移位和乘以2的幂之間的關系。

我們已經看到了幾種使用位級運算和算術運算組合的聰明方法。例如,使用補碼運算,~x+1等價于 -x 。另外一個例子,假設我們想要一個形如[0,…,0,1,…,1]的位模式,由w - k個0後面緊跟着k個1組成。這些位模式有助于掩碼運算。這種模式能夠通過C表達式(1<<k)-1生成,利用的是這樣一個屬性,即我們想要的位模式的數值為2k-1。例如,表達式(1<<8)-1将産生位模式0xFF。

浮點表示通過将數字編碼為x×2y的形式來近似地表示實數。最常見的浮點表示方式是由IEEE标準754定義的。它提供了幾種不同的精度,最常見的是單精度(32位)和雙精度(64位)。IEEE浮點也能夠表示特殊值+∞、-∞和NaN。

必須非常小心地使用浮點運算,因為浮點運算隻有有限的範圍和精度,而且不遵守普遍的算術屬性,比如結合性。

這一章主要是一些關于計算機底層最基本的數值運算,在以前學習過的基礎上又新加了一些更專業更學術的方法,是以學好這一章就要多練多做題,大部分知識和方法以前有接觸過是以學起來不是特别困難,但是因為十一要出去玩導緻時間有點緊有些問題不能深入的思考研究,有些問題隻能等十一回來再繼續學習。

看了一下午的書,正在努力搞懂書上的題目。發現對離開書本根本寫不出什麼代碼,本來想試着完成一個課後作業糾結了好久最終還是無奈的放棄了,先把課後的重點練習題好好看一遍再說吧。