標籤:
第2章 資訊的表示和處理
(一)、三種重要的數字表示
無符號數:編碼基於傳統的二進位標記法(大於或者等於零的數字)。
補碼:編碼是表示有符號整數的最常見方式(為正或者為負的數字)。
浮點數:編碼是表示實數的科學記號標記法的以二為基數的版本。
整數的表示雖然只能編碼一個相對較小的數值範圍,但是是精確的;而浮點數雖然可以編碼一個較大的數值範圍,但是這種表示是近似的表示。
大量的電腦安全性漏洞都是由於電腦運算的微妙細節引發的。
(二)、資訊儲存
電腦最小的可定址的儲存空間單位——位元組
一個位元組的範圍:00H-FFH
一、十六進位標記法1. C標記法
以0x或0X開頭的數字常量為十六進位
2. 進位轉換
常用進位:二進位(B),十進位(D),八進位(O或者Q),十六進位(H)
轉換為二進位-十六進位相互轉換,二進位的四位元字對應十六進位的一位元字。
同理,二進位與八進位的轉化是三位對應一位。
但是通常情況下,進位轉換都以二進位為橋樑進行轉換。
註:特殊情況
課本23頁有這樣一種情況,要表示的數字常量x=2的n次方時,n=i+4j,且0≤i≤3時,開頭的十六進位數字為1(i=0)、2(i=1)、4(i=2)、8(i=3),後面跟隨著j個十六進位的0。這裡的j是代表著每四位二進位位對應的十六進位位,而i的範圍是因為十六進位中每一位的範圍是0-F,最多能容納到8。這是一種方便快捷的計算方法。
二、字
字長決定虛擬位址空間的最大大小。
字長為w,虛擬位址的範圍為1-(2^w-1)
w=32或64:也就是我們通常所說的電腦是32位還是64位。也可以理解為CPU一次處理資料的位元。
三、資料大小
在不同字長的電腦中,相同的資料類型所佔用的位元組數並不相同,32位和64位的區別參見教材26頁表格。
gcc -m32 可以在64位機上產生32位的代碼
四、定址和位元組順序1.小端法和大端法
- 小端法:最低有效位元組在前面——“高對高,低對低”
- 大端法:最高有效位元組在前面2.強制類型轉換
- typedef:命名資料類型
- sizeof():傳回型別的位元組數(好處?便於移植——32位和64位的區別)
五、表示字串
c語言中字串被編碼成為一個以null(值為0)字元結尾的字元數組
命令man ascii:得到ASCII字元碼錶
六、表示代碼
二進位代碼在不同的作業系統上有不同的編碼規則。所以二進位代碼是不相容的
七、布爾代數
1.最簡單布爾代數:與& 或| 非~ 異或^(結果為0或1)
2.擴充的布爾運算:位向量的運算(結果仍是位向量)
位向量的應用:表示有限集合,對集合編碼
八、位級運算
1.將位向量按位進行邏輯運算,結果仍是位向量
2.掩碼運算
掩碼:用來選擇性的屏蔽訊號,是一個位元模式,表示從一個字中選出的位的集合。
用位向量給集合編碼,通過指定掩碼來有選擇的屏蔽或者不屏蔽一些訊號,某一位位置上為1時,表明訊號i是有效;0表示該訊號被屏蔽。這個掩碼就表示有效訊號的集合。
0xFF:屏蔽除最低有效位元組之外的所有位元組。
~0:產生全1的掩碼
九、邏輯運算
1.邏輯運算子:與&& 或|| 非!
2.計算方法:所有非零參數都代表TRUE,0參數代表FALSE。1代表TRUE,0代表FALSE
- 只有當參數被限制為0或1時,邏輯運算才與按位元運算有相同的行為。
- 如果對第一個參數求值就能確定運算式的結果,邏輯運算子就不會對後面的參數求值。
十、移位元運算
1.左移<<
2.右移>>
邏輯右移:在左端補k個0,多用於無符號數移位元運算
算術右移:在左端補k個最高有效位的值,多用於有符號數移位元運算。
- Java中用>>表示算術右移,用>>>表示邏輯右移
- 移位元運算優先順序小於算術運算
(三)、 整數表示一、整數資料型別
整數資料型別——表示有限範圍的整數,每種類型都能用關鍵字來指定大小,還可以指定是非負數(unsigned)還是負數(預設)。這些不同大小的分配的字數會根據機器的字長和編譯器有所不同。
關於取值範圍
- 32位機器和64位機器對於同一資料類型的典型取值範圍是有所不同的。
- 典型取值範圍中,取值範圍不對稱——負數的範圍比整數的範圍大1。
- c語言標準定義的每種資料類型必須能夠表示的最小的取值範圍中,正數和負數的取值範圍是對稱的。
具體範圍見書38頁。
要用C99中的“long long”類型,編譯是要用 gcc -std=c99
二、無符號數的編碼
編碼方法見書,已經在很多門課程中都學習過了。
需要注意的是無符號數的二進位表示的一個重要性質:
0-(2^w)-1中的每一個整數和長度為w的位向量是一一對應的。
三、補碼編碼——有符號數的編碼
關於補碼,一些可能沒有注意過的知識:
- 我們都知道補碼的最高位是表示符號位,解釋為負權,“權重”為-2的(w-1)次方,即無符號表示中的權重的負數。符號位為1,表示值為負,符號位為0,表示值為非負(不是正,因為有0)
- 補碼的映射關係同樣是一一對應的
- 補碼的範圍:-2^(w-1)~2^(w-1)-1,即|TMin|=|TMax|+1——因為非負數中0的存在。
- 無符號數編碼(U)和補碼(T):UMax = 2 TMax + 1
- 大多數情況下用補碼來表示有符號數,並且具有的是典型的取值範圍。
有符號數的其他表示方法:
四、有符號數和無符號數的轉換1.強制類型轉換
從位級角度考慮。
強制類型轉換的結果保持位值不變,只是改變瞭解釋這些位的方式。即:這些位上的值不變,但是由於最高有效位的權重發生變化,從而導致結果發生改變。
2.c語言中的有符號數和無符號數及其轉換轉換原則:底層的位保持不變。(1)有符號數→無符號數
- 非負數——保持不變
-
負數——轉換成大正數
(2)無符號數→有符號數
以2的w-1次方為界限:
- 小於它——保持不變
-
大於它——轉換為負數值
六、擴充一個數位位表示
擴充:從一個較小的資料類型轉換為較大的資料類型,同時保持數值不變。
1.零擴充:在開頭加上0。多用於無符號數轉換為一個更大的資料類型。
2.符號擴充:添加最高有效位的副本。多用於補碼數字轉換
七、截斷
截斷:減少表示一個數位位元。而這麼做可能會改變它的值,這也是溢出的一種形式。
將一個w位的數截斷為k位元字時,就會丟棄高w-k位。
- 對於無符號數來說,就相當於 mod 2的k次冪
- 對於有符號數來說,先按照無符號數截斷,然後再轉化為有符號數
(四)、 浮點數
浮點表示對形如V=x X (2^y)的有理數進行編碼,適用於:
非常大的數字非常接近於0的數字作為實數運算的近似值
一、二進位小數
小數的二進位標記法只能表示那些能夠被寫成x X (2^y)的數,其他的值只能近似的表示。
權重
以小數點為界:
左邊第i位,權重為2的i次冪右邊第i位,權重為1/2的i次冪
二、IEEE浮點表示IEEE浮點標準:
用V=(-1)^s X 2^E X M 來表示一個數:符號:s決定這個數是正還是負。0的符號位特殊情況處理。階碼:E對浮點數加權,權重是2的E次冪(可能為負數)尾數:M是一個二進位小數,範圍為1~2-ε或者0~1-ε(ε=1/2的n次冪)
編碼規則:
單獨符號位s編碼符號s,佔1位k位的階碼欄位exp編碼階碼En位小數欄位frac編碼尾數M(同時需要依賴階碼欄位的值是否為0)
兩種精度
- 單精確度(float),k=8位,n=23位,一共32位;
- 雙精確度(double),k=11位,n=52位,一共64位。
1.規格化的值
即exp的位元模式既不全0也不全1的時候,這是最一般最普遍的情況,因而是規格化的。
2.非規格化的值
即階碼域全為0時的數。
3.特殊值
特殊值是在階碼位全為1的時候出現的。分為兩種情況:
(1)無窮
小數欄位全為0
(2)NaN不是一個數
小數欄位非0
三、舍入
舍入運算:找到和數值x最接近的匹配值x‘,可以用期望的浮點形式表示出來。
IEEE浮點格式定義了四種不同的舍入方法:
1.向偶舍入(預設方法)
即:將數字向上或向下舍入,是的結果的最低有效數字為偶數。
能用於二進位小數。
2.向零舍入
即:把整數向下舍入,負數向上舍入。
3.向下舍入
正數和負數都向下舍入。
4.向上舍入
正數和負數都向上舍入。
四、浮點運算1.浮點加法
- 浮點加法是可交換的
- 浮點加法不具結合性
- 大多數值的浮點加法都有逆元,除了無窮和NaN。
- 浮點加法滿足單調性
2.浮點乘法
- 浮點乘法是可交換的
- 浮點乘法不具有結核性
- 浮點乘法的單位元為1.0
- 浮點乘法在加法上不具備分配性
五、c語言中的浮點數
int、float、double相互轉換?
int → float 不會溢出但有可能舍入int/float → double 結果保留精確數值double → float 可能溢出為±∞,由於精確度較小也有可能被舍入float/double → int 向零舍入,可能溢出。
資訊安全系統設計基礎第三周學習總結-呂松鴻