標籤:
資訊的表示和處理
1.三種數字表示
無符號
基於傳統二進位標記法,表示大於或者等於零的數字。
補碼
表示有符號整數的最常見方式
浮點數
表示實數的科學計數法的以二為基數的版本。
2.資訊儲存
1.進位
二進位、八進位、十進位、十六進位(轉換:以二進位作為中間變數)
十六進位:以0x或0X開頭表示,字元A-F可大寫可小寫。
2.字
虛擬位址是以這樣的一個字來編碼的。
每台電腦都有一個字長,指明整數和指標資料的大小。
字長決定虛擬位址空間的最大大小,字長決定的最重要的系統參數就是虛擬位址空間的最大大小。對一個字長為w位的機器,虛擬位址的範圍為0-2^(w-1),程式最多訪問2^w個位元組。
3.資料大小
C語言支援整數和浮點數的多種資料格式
4.定址和位元組順序
小端法——在儲存空間中按照從最低有效位元組到最高有效位元組的順序儲存物件。
大端法——從最高有效位元組到最低有效位元組的順序儲存。
(小端法:高對高,低對低。大端法:高對低,低對高。)
舉例:變數x十六進位值為0x01234567,
定址和位元組順序
小端法:最低有效位元組在最前面,“高對高,低對低”,是大多數intel相容機,包括IBM和Sun的個人intel相容處理器的電腦使用的規則。
例如:變數x為int,位於地址0x100,十六進位值為0x01234567。
小端法:
地址: 0x100 0x101 0x102 0x103
67 45 23 0
在0x01234567中,高位位元組為0x01,低位位元組為0x67。
PS:位元組順序是網路編程的基礎。
5.布爾代數
(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個最高有效位的值(用於有符號數)
6、補碼編碼
補碼形式是最常見的有符號數的電腦表示方式 將字的最高有效位解釋為負權 B2T(W)函數為:B2T(x) = -x(w-1)2^(w-1)+∑xi2^i(求和從i=0到i=w-2)
7、有符號數和無符號數之間的轉換
處理同樣字長的有符號數和無符號數之間相互轉換的一般規則:數值可能會改變,但是位元模式不變。 c語言允許無符號數和有符號數之間的轉換。轉換的原則是底層的位表示不變。 當從無符號數轉換為有符號數是,效果是應用函數U2T,從有符號數轉化為無符號數時,應用函數T2U,其中w表示資料類型的位元。 負數和正數相等的情況:u=2147483648 =-2147483648 (當輸出分別為無符號形式和有符號形式時)
8、擴充數的位表示
零擴充:將無符號數轉換為更大的數在表示的開頭添加0 符號擴充:將一個補碼數字轉換為一個更大的資料類型
9、截斷數字
截斷數字:不用額外的位來擴充一個數值,而是減少表示一個數位位元。
10、整數運算(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) 注意:對於n為最高位的情況,B:-(x<<m)
(7)除以2的冪
設x/K,令K=2^n, 當x為正數時,計算 x>>n; 當x為負數時,將x加上偏置量,即加上2^n-1(即K-1),計算** (x+偏置量)>>n**。
(8)關於整數運算的最後思考
電腦執行的“整數”運算實際上是一種模運算形式; 表示數位有限字長限制來了可能的值的取值範圍,運算結果可能溢出; 補碼錶示提供了一種即能表示負數也能表示正數的靈活方法,同時使用了與執行無符號算術相同的位級實現; c語言中的unsigned資料類型的使用也應當特別注意,比如,在書寫整數常數和調用庫函數的時候。
1.二進位小數
定點標記法:“.”為界(不能有效表示很大的數)
十進位:小數點左邊的數位權是10的非負冪,得到整數值;右邊的數位權是10的負冪,得到小數值。
二進位:小數點左邊的數位權是2的非負冪,右邊的數位權是2的負冪。
IEEE浮點表示1.用V = (-1)s * M * 2E的形式來表示一個數:
符號:s決定這個數是負數(s = 1)還是正數(s = 0),而對於數值0的符號位解釋作為特殊情況處理。
尾數:M是一個二進位小數,它的範圍是1 ~ 2-ε,或者是0 ~ 1-ε。
階碼:E的作用是對浮點數據加權,這個權重是2的E次冪(可能是負數)。
2.將浮點數的位表示劃分為三個欄位,分別對這些值進行編碼:
一個單獨的符號位s直接編碼符號s。
k位的階碼欄位exp = ek-1…e1e0編碼階碼E。
n位小數欄位frac = fn-1…f1f0編碼尾數M,但是編碼出來的值也依賴於階碼欄位的值是否等於0。
3.兩種常見的格式
C語言中的單精確度浮點格式float 和雙精確度浮點數格式double。
在float中,s、exp和frac欄位分別為1位、k = 8 位和n = 23位,得到一個32位的表示;
在double中,s、exp和frac欄位分別為1位、k = 11 位和n = 52位,得到一個64位的表示。
遇到的問題:
1.對浮點數舍入規則中的向偶數舍入的規則不太理解
2.溢出還有些地方不清楚
資訊安全系統設計基礎第三周筆記