計算機組成原理(定點數

哈嘍大家好,我是TianshiyuMogui,距離我們上一期已經有段時間沒更新了,最近太難了。這期內容帶大家瞭解什麼是定點數/浮點數,廢話不多說開始。

計算機組成原理(定點數/浮點數/溢出

都知道計算機數值是以二進制補碼形式進行存儲,那麼問題來了,數值中除了整數外還有小數存在,那麼小數點在計算機中是如何表示的呢?

小數的小數點在計算機中有兩種表達方式;
一種是約定數值的小數點隱含在某一個固定位置上(定點數)表示數值範圍小;
另一種則是小數點的位置可以浮動(浮點數)表示數值範圍大;
定點數/浮點數是為了解決小數點的問題。

1.定點數

概念:顧名思義就是小數點是固定的,約定數值的小數點隱含在某一個固定位置上;、

小數點固定在機器數的最低位(定點整數)小數點固定在符號位後面(定點小數)

所以定點數分為:定點(純)整數、定點(純)小數。

表示格式

計算機組成原理(定點數/浮點數/溢出

定點整數/小數表示格式

  • 定點整數

格式:符號位=數值部分(尾數) .小數點

涉及有符號數和無符號數,原碼、反碼和補碼這些內容在我們上一期內容有講到,那麼我們再來講講有/無符號數吧!

有符號數:最高為代表符號位(0代表正、1代表負)其餘代表數值

例如:1111=-7

無符號數:所有數都代表數值,沒有符號位,它沒有負數。

例如:1111=15

  • 定點整數數值表示/數值範圍

計算機組成原理(定點數/浮點數/溢出

整數數值表示/數值範圍

  • 定點小數

定點小數數值表示/表示範圍:

計算機組成原理(定點數/浮點數/溢出

定點數數值表示/表示範圍

( 其中x0為符號位,x1~xn是數值的有效部分,也稱為尾數x1為最高有效位 )

位數是定長的,所以表示的值是有限的,運算結果超出表示範圍就是溢出

定點數溢出的判定

數值判定,如果計算機的機器子長為4,那麼能夠表示的真值範圍在-8---+7之間,如果兩個數相減,跳出了這個範圍,則為溢出

次高位向最高為進位異或(⊕)、最高位向進位位進位的方法來判定,其值位1,表示溢出,

用雙符號來判定。

小數定點數中的數,其絕對值必須小於1,否則“溢出”,此時要求機器停止運算,進行處理。

定點數表示數值有限,所以表示比較大的數時我們用浮點數來表示(範圍大)

2.浮點數

概念:顧名思義浮點數,就是小數點的位置可以任意浮動

百度定義是:浮點數,是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數為10的科學計數法。

計算機組成原理(定點數/浮點數/溢出

浮點數分為兩種表示形式:一種是一般格式(也是百度常見的) 另一種是IEEE754標準格式

一般格式如圖

計算機組成原理(定點數/浮點數/溢出

浮點數一般表示格式

階碼就是指數;階符就是指數的符號;數符是指尾數的符號,它們各佔多少位取決於表示範圍,表示精度等方面的權衡。比如32位長的浮點數,階符和階符各用1位,階碼可以用7位,尾數23位;階符和階碼也可以結合起來,用一個8位來表達,一般格式中將數符放在中間部分,這與定點表示格式不一致,而且在計算機處理時也不夠方便,因此實際中一般採用IEEE754來表示格式,如下。

計算機組成原理(定點數/浮點數/溢出

IEEE754格式

符號:(正 0 負1)

有效數 S(significant)

指數 E(exponent)

  • 基數 B(二進制的基數等於2)隱含的不用存儲,因為它對所有數值都是相同的
計算機組成原理(定點數/浮點數/溢出

浮點數IEEE754標準格式

最左位保存數的符號(0=正,1=負(符號位));

指數值存於位1到位8,所用的表示法稱為偏移表示法;

最後一部分是有效數(尾數)。此例的基值被認為是2;

如果不對浮點數的表示作出規定,同一個浮點數的表示就不是唯一的,為了提高數據的表示精度,當尾數不為0的時,其絕對值規定0.5≤S<1,即尾數的最高有效位應為1,否則要以修改階碼同時左右移小數點的方法,使其變成符合這一要求的表示形式,這稱為浮點數的規格化處理,這樣也為了節省空間。由於尾數最高有效位為1,可左移後不代表不佔位,可使尾數無形中增加一位,從而增加了尾數精度。指數規定用偏移表示法,即在補碼的基礎上加上128,相當於補碼的符號位取反,稱為移碼最大值為全1,最小值為全0;偏移指數的值為±2^E-128。

浮點數規格化

浮點數都是近似表示的,精度由尾數決定,數的表示範圍大小由R、E決定,為了提高精度需要使尾數的有效位數儘可能佔滿可用的位數,這種稱為浮點數的規格化。

規格化要求尾數:

1/R<=|M|<1

R=2時 0.5<=|M|<1

即2^-1<=|M|<2^0

(0.1)2↓<=|M|

右規:尾數右移一位,階碼+1

左移:尾數左移一位,階碼-1

對於規格化浮點數小數點後第一個值時固定的(正數:1,負數:原碼1、補碼0)

所以該位往往缺省,稱為隱藏位。

規格化處理,若得到的結果不滿足規格化規則,就必須把它變成規格化的數,對雙符號位的補碼尾數來說,就必須時001XX....X或110XX...X的形式。

當結果尾數的兩個符號位的值不同時,表明尾數運算結果溢出。此時應使結果尾數右移一位,並使階碼的值加1,這被稱為向右規格化,簡稱右規。

當尾數的運算結果不溢出,但u子高數值位於符號位同值,表明不滿足規格化規則,此時應重複地使尾數左移、階減減1,直到出現在最高數值位上的值與符號位的值不同為止,這是向左規格化的操作,簡稱左規。

有規格化同樣也有非規格化這裡給出別文作者大家一起學習:https://blog.csdn.net/justheretobe/article/details/7703575

浮點數表示範圍:https://blog.csdn.net/qq_36636525/article/details/80775747

計算機組成原理(定點數/浮點數/溢出

如果一個浮點數的尾數為0,不論其階碼為何值,或者階碼的值為0(實際值我為-128),不管其尾數為何值,計算機都把該浮點數堪稱零值,稱為機器零。

假設由S、E、M三個域組成的一個32位二進制字所表示的非規格化浮點數X,其真值表示為

X=±S*B^±E=(-1)^s*(1,M)*2^E-128

問:它所表示的規格化的最大正數,最小正數,最大負數,最小負數是什麼?

如圖解答:

計算機組成原理(定點數/浮點數/溢出

解析

浮點數的溢出,若指數E>127,無論正負,均為絕對值大於可以表示的範圍,稱為”上溢“;若指數E=0,無論正負,均為絕對值小於可表示的範圍,稱“下溢”。為“下溢”即可堪稱是機器零。

浮點數的溢出是以其階碼溢出表現出來的。在加\\減運算過程中要檢查是否產生了溢出:若階碼正常,加(減)運算正常結束;若階碼溢出,則要進行相應處理。另外對尾數的溢出也需要處理。

階碼上溢 超過了階碼可能表示的最大值的正指數值,一般將其認為是+∞和-∞。

階碼下溢 超過了階碼可能表示的最小值的負指數值,一般將其認為是0。

尾數上溢 兩個同符號尾數相加產生了最高位向上的進位,將尾數右移,階碼增1來重新對齊。

尾數下溢 在將尾數右移時,尾數的最低有效位從尾數域右端流出,要進行舍入處理

定點數/浮點數比較可以看出

1.當浮點數和定點數中數的位數相同時,浮點數的表示範圍比定點數大得多。

2.當浮點數為規格化數時,其相對精度遠比定點數高。

3.浮點數運算要分階碼部分和尾數部分,而且運算結果都要求規格化,故浮點數運算步驟定點於是奶奶步驟多,運算速度比定點數運算低,運算線路比定點運算複雜。

4.溢出判斷上,浮點數時對規格化數的階碼進行判斷,而定點數是對數值本身進行判斷及上述所說。

浮點數在數的表示範圍、數的精度、溢出處理和程序編程等方面均優於定點數,但運算規則,運算速度及硬件成本方面不如定點數,計算機一般採用浮點數多。

溢出

溢出分為很多種比如.asp溢出 .ida/idq溢出 IIS ASP溢出、Apache分塊編碼溢出、openssh響應機制溢出,有符號/無符號溢出c語言中會有學到...........傳統的溢出一般都是發生在字符串類型數據上面,用戶提交數據超出程序分配的字符串大小,造成覆蓋系統數據結構,最終導致程序流程改變。

我們最常見的是整形溢出和緩衝區溢出了

計算機組成原理(定點數/浮點數/溢出

整形溢出可能會導致緩衝區溢出,緩衝區溢出會導致各種黑客攻擊,OpenSSLde的hartbleed事件,就是一個buffer oberread的事件,Signed整形溢出大多數負數,很小几率是正數

緩衝區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟件中廣泛存在;利用緩衝區溢出攻擊,可以導致程序運行失敗、系統宕機、重新啟動等後果;可以利用它執行非授權指令,取得系統特權,進而進行各種非法操作。

操作系統所使用的緩衝區又被稱為"堆棧".。在各個操作進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩衝區溢出。

緩衝區溢出攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它們指的都是同一種攻擊手段。第一個緩衝區溢出攻擊--Morris蠕蟲,發生在1988年,由羅伯特,莫里斯(R ob。rtMorris)製造,它曾造成全世界6000多臺網絡服務器癱瘓。

在當前網絡與6漏洞的蠕蟲。而緩衝區溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意代碼,比如得到shell,然後為所欲為。

計算機組成原理(定點數/浮點數/溢出

溢出攻擊原理

通過往程序的緩衝區寫超出其長度的內容,造成緩衝區的溢出,從而破壞程序的堆棧,造成程序崩潰或使程序轉而執行其它指令,以達到攻擊的目的。造成緩衝區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:

void function(char *str) {

char buffer;

strcpy(buffer,str);

}

上面的strcpy()將直接把str中的內容copy到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標準函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。

當然,隨便往緩衝區中填東西造成它溢出一般只會出現“分段錯誤”(Segmentation fault),而不能達到攻擊的目的。

最常見的手段是通過製造緩衝區溢出使程序運行一個用戶shell,再通過shell執行其它命令。如果該程序有root或者suid執行權限的話,攻擊者就獲得了一個有root權限的shell,可以對系統進行任意操作。

緩衝區溢出攻擊之所以成為一種常見安全攻擊手段其原因在於緩衝區溢出漏洞太普遍了,並且易於實現。而且,緩衝區溢出成為遠程攻擊的主要手段其原因在於緩衝區溢出漏洞給予了攻擊者他所想要的一切:植入並且執行攻擊代碼。被植入的攻擊代碼以一定的權限運行有緩衝區溢出漏洞的程序,從而得到被攻擊主機的控制權。所以編寫正確的代碼是一件非常有意義的工作。想要深入可搜索這方面內容進行學習哦!

補充上期補碼內容:補碼只有8位時,最高位第九位自然丟失,即驗證了正數的補碼為該正數本身。

最後告訴大家是很多東西是必須要做的,比如?學習啊!哈哈。想要在計算機領域走的更遠的話,英語數學這兩門科目很很重要。放下你手中的遊戲,抖音、短視頻....來跟我一起學習,一起交流,一起成長吧!如果你連自己都控制不住的話,怎麼掌控你的人生?

好啦本期內容就結束了,喜歡的朋友記得點贊評論轉發收藏加關注哦!,

作者: TianshiyuMogui


分享到:


相關文章: