在計算機中,小數點並無用專門的器件去表示,而是按照一種約定的方式,統一存儲在寄存器單元中的。算數邏輯運算單元(ALU)是CPU的組成部分,負責算數和邏輯的運算。那麼,ALU到底是如何工做的呢?
這就是本文主要探討的內容:微信
從字面意思來理解,「定點數」就是「點」不動的數。那麼到底是什麼「點」不動呢?沒錯,就是「小數點」。
在上一講咱們說道,不管是整數仍是小數,都是有小數點的。整數的小數點表示在最後一位數字的後面,而小數的小數點標識在真值的符號位後面。如圖所示:blog
除了定點數,還有一種數叫作「浮點數」,浮點數將在下一講展開介紹。基礎
好了,介紹完定點數的基本概念之後,咱們展開講定點數的位移運算和四則運算。定點數的四則運算實際上要比咱們想象的複雜的多。
機器並不像人,一眼就知道二二得四,他須要知道2的定點表示形式,而後兩個定點數相乘,相乘是有必定的過程的,通過了這個過程,才能獲得結果的二進制數,最終輸出給咱們。咱們要作的,就是了解加減乘除究竟經歷了什麼樣子的過程。原理
不要看移位運算簡單,可是它在計算機的運算中的地位是舉足輕重的。沒有移位運算,也就沒有後面的乘除法,乘除法就是在移位運算和加減運算的配合下實現的。
移位運算的規則:雖然正數和負數的移位運算規則不相同,可是相同之處在於移位後正數和負數的符號不變。那麼規則就變成了移位運算時,符號位不動,數值位按照以下規則進行移位。
舉個例子:權限
將+26的原碼、補碼和反碼分別左移一位
結果是:[26]原 = [26]反 = [26]補 = 0,0011010,根據規則,原碼、反碼、補碼左移一位的結果是:0,010100二進制
將-26的原碼、反碼、補碼分別左移一位
[-26]原 = 1,0011010,左移一位:1,0110100
[-26]反 = 1,1100101,左移一位:1,1001011
[-26]補 = 1,1100110,左移一位:1,100110方法
移位的運算是否是很簡單?只須要根據規則來就能夠了。重點在下面的幾種運算中。im
定點數的加減運算只須要記住一個原則:加法直接加,減法先變爲加法後再計算。
什麼意思呢?好比[A+B]補 = [A+B]補,[A-B]補 = [A]補 + [-B]補。
來看兩個例子:總結
A = -1001,B = -0101,求[A+B]補
[A+B]補 = [A]補 + [B]補,[A]補 = 1,0111,[B]補 = 1,1011,因此最終的結果是:11,0010,可是這並不是咱們的最終結果,最終結果應該丟掉第一個1,即1,0010.爲何呢?這涉及到一個模2運算的問題,若是不想深究只須要記住,一個數只能有一個符號位不是嗎?微信公衆號
A = -1001,B=-0101.求[A-B]補
[A-B]補 = [A]補 + [-B]補,[A]補=1,0111,[-B]補=0,0101(求法:[-B]補等於[B]補符號位和各位取反,末位加一),這樣獲得最終的結果,丟棄掉多餘的位便可。
溢出的判斷:若是計算機的機器字長爲4,那麼可以表示的真值範圍在-8~+7之間,若是兩個數相加減,跳出了這個範圍,則爲溢出。
那麼應當如何判斷溢出呢?
原則:
乘法的運算方式造成過程,我推薦你們看看計算機專業的教材,即唐朔飛老師的《計算機組成原理》。本文奔着實用性的角度,不會過分發掘計算方法的推導過程,由於個人解釋並不如教材上的好。至於真正的計算,不能說是優於教材,最起碼你你可以快速上手計算,若是你作到了,那麼個人目的也就達到了。
定點數乘法的計算方式:
原碼一位乘
原碼兩位乘:原碼兩位乘有運算規則,和一位乘有着相似的地方,可是不盡相同。原碼兩位乘是用兩位乘數的部分來決定新的部分如何造成的運算方式。兩個二進制數共有四種形態:00,01,10,11,能夠表示不一樣的移位方式以及加法的方式(下面會看到)。再加上一位標誌位C,就能實現更加複雜的操做。如圖所示:
有了上面的規則,就可以很輕易的根據原碼一位乘作出原碼兩位乘,計算過程:初始化部分積爲0,寫入乘數,標誌位置爲0.判斷乘數的後兩位以及標誌位知足何種關係,調用相應的方法移位並設置標誌位,最後的結果向右移動兩位,根據x和y的符號的異或肯定符號。有必要說明的是,兩位乘需預留出3位符號位。給出個例子:
補碼乘法:補碼一位乘與原碼一位乘相似,區別在於,當乘數爲正時,補碼乘法運算方法與原碼一位乘運算方式相同;當乘數爲負數時,補碼一位乘前半部分一樣和原碼一位乘相同,不一樣之處是在運算完成後,須要把最終結果加上[-x]補用於校驗,才能獲得最終的結果。這部分的推導一樣能夠參見教科書。下面給出一個例子:
補碼比較法:相信有了前面的基礎,直接給出規則你就可以解決問題了,補碼比較法的運算規則以下:
給出例子:[x]補 = 0.1101,[y]補 = 0.1011.運算過程以下:
補碼兩位乘:補碼兩位乘和上面的方式沒有太多的區別,主要就是兩位乘採用三位符號位,三位判斷位(乘數的位),有了運算規則,作出題目簡直太簡單了。
例子:[x]補=0.0101,[y]補=1.0101,求[x*y]補。
這篇文章的內容已經比較多了,爲了方便讀者消化知識,除法的講解放在下一篇文章中,敬請期待。
若是你喜歡個人文章,請關注個人微信公衆號「最高權限比特流」吧!
【參考文獻】《計算機組成原理》,唐朔飛。