總結
加法運算過程:
十進制:
1+1=2
二進制
01+01=10
實現過程:
在做加法時CPU內部會調用加法器,實際上加法運算器所做的工作就是按位與操作和進位運算!所謂的進位運算規則和十進制一樣滿10進一而二進制就是滿2進1,01&01=01,由於兩個二進制位上的數相加等於2符合滿二進一的規則則向前一位進一:10 整數的補碼就是本身所以不需要補碼。
減法運算過程:
在說一下減法運算
十進制:
5-2=3
二進制:
0101-0010=011
實現過程:
在做減法時要先將減數轉換成負數然后補碼,在進行與運算然后進位補碼!
先將010轉換負數原碼 轉換過程如下:
先取反(包括符號位)010取反101,在取反110得到負數的原碼在補碼111,在與加數進行與運算0101&0111=1001由於1+1=2進位1010在補碼得到1011最后在取反(包括符號位)0100,在取反(不包括符號位)得到正數的原碼0011在補碼0011整數的補碼就是本身!在進行加法運算時不需要做額外的補碼運算,所以加法運算要快於減法運算!
乘法運算過程:
十進制:
5*2=10
二進制:
0101*0010=01010
實現過程:
首先CPU會初始化三個通用寄存器用來存放被乘數,乘數,部分積的二進制數,部分積寄存器初始化為0!
然后在判斷乘數寄存器的低位是低電平還是高電平(0/1)!
如果為0則將乘數寄存器右移一位,同時將部分積寄存器也右移一位,在位移時遵循計算機位移規則,乘數寄存器低位溢出的一位丟棄,部分積寄存器低位溢出的一位填充到乘數寄存器的高位,同時部分積寄存器高位補0!
如果為1則將部分積寄存器加上被乘數寄存器,在進移位操作。
當所有乘數位處理完成后部分積寄存器做高位乘數寄存器做低位就是最終乘法結果!
CPU處理過程:
0101*0010=1010
首先初始化三個通用寄存器存放被乘數(0101),乘數(0010),部分積(0000),在判斷乘數寄存器為0/1,判斷乘數寄存器(0010)低位為0則直接進行對乘數寄存器和部分積寄存器進行位移!
乘數寄存器:0010->1=0001溢出0丟棄
部分積寄存器:0000->1=0000溢出0填充到乘數寄存器高位同時部分積寄存器高位補0
此時乘數寄存器里的二進制數為0001,部分積寄存器為0000!
在判斷乘數寄存器低位為0/1,判斷結果為1則先讓部分積寄存器加上被乘數寄存器在進行位移動!
部分積加上被乘數:
部分積寄存器:0000+0101=0101
位移:
乘數寄存器:0001->1=0000低位溢出的1丟棄
部分積寄存器:0101->1=0010
低位溢出的1填充到乘數寄存器高位同時部分積寄存器高位補0
此時乘數寄存器為1000,部分積寄存器為0010!
在判斷乘數寄存器低位為0直接位移
乘數寄存器:1000->1=0100低位溢出的0丟棄
部分積寄存器:0010->1=0001,低位溢出的0填充到乘數寄存器高位同時部分積寄存器高位補0
在乘數寄存器為0/1,判斷結果為0則直接進行位移:
乘數寄存器:0100->1=0010低位溢出的0丟棄
部分積寄存器:0001->1=0000低位溢出1填充到乘數寄存器高位同時部分積寄存器高位補0
位移完后的乘數寄存器為1010,部分積寄存器為0000。
當所有乘數處理完后部分積寄存器做高位乘數寄存器做低位:00001010,轉換為十進制就是10!
除法運算過程:
十進制:
10/2=5
二進制:
1010/10=101
實現過程:
首先CPU會初始化三個寄存器,用來存放被除數,除數,部分商!余數(被除數與除數比較的結果)放到被除數的有效高位上!
CPU做除法時和做除法時是相反的,乘法是右移,除法是左移,乘法做的是加法,除法做的是減法。
首先CPU會把被除數bit位與除數bit位對齊,然后在讓對齊的被除數與除數比較(雙符號位判斷)。
這里說一下什么是雙符號位判斷:
比如01-10=11(前面的1是符號位) 1-2=-1 計算機通過符號位和后一位的bit位來判斷大於和小於,那么01-10=11 就說明01小於10,如果得數為01就代表大於,如果得數為00代表等於。
如果得數大於或等於則將比較的結果放到被除數的有效高位上然后在商寄存器上商:1 並向后多看一位
(上商就是將商的最低位左移1位騰出商寄存器最低位上新的商)
如果得數小於則上商:0 並向后多看一位
然后循環做以上操作當所有的被除數都處理完后,商做結果被除數里面的值就是余數!
CPU處理過程:
首先初始化三個寄存器存放被除數,除數,部分商,部分商會初始化為0(可初始化也可以不初始化因為會做上商過程)
首先把被除數寄存器左移2位與除數寄存器對齊:
1010<<2=10(10)
在用對齊后的被除數與除數做比較:
10(10)-10=00 剛好等於沒有溢出所以上商1,商為0001,在將相減的結果(00)放到被除數有效的高位此時被除數有效的最高位為10(10),此時被除數的bit位為0010,
在左移1位:
0010<<1=001(0)
在用位移后的被除數與除數做比較:
001(0)-10=11 符號位為1負數也就是說被除數小於除數所以上商0,商為0010
在左移0位
0010<<0=0010
在用位移后的被除數與除數做比較:
0010-10=00 兩個符號位都為0相等所以上商1,商為101,在將其放到商的有效高位此時被除數的有效bit位為最低的兩位(00)10
所有的被除數處理完后商做結果被除數做余數,商為101,余數為00,轉換成十進制就是5余0!
知識點:
現在很多CPU都有自己的乘法器和除法器,這些器件的工作原理和我上面寫的一樣,都是通過ALU(算術邏輯運算單元)調用加法器來協調工作完成計算!這些運算器存在於CPU內部,一般每個運算器都是由ALU,通用寄存器,專用寄存器,晶體管和一些其它附加電路組合而成,專用寄存器是指一些只能用於固定功能的寄存器,比如程序計數寄存器(PC),標志寄存器(FR),堆棧寄存器(SP),作用是固定的只能用來存放地址或者地址基址!
浮點數在計算機中有特定的浮點存儲器來存放和浮點運算器來運算,不同精度的浮點數能精確到小數點后的不同位,比如float單精度能精確到小數點的后7位雙精度能精確到16位,這個精確度取決於你的電腦內存和CPU,假如你的內存允許精確到7或者16位但是CPU不支持也是無法處理那么多位的!