計算機組成原理 - 定點整數的原碼補碼運算(待驗證)


計算機組成原理 - 定點整數的原碼補碼運算(待驗證)

〇、環境

對象 運算
定點整數原碼、定點整數補碼 移位、加、減、乘、除

原碼定義

\(x=\begin{cases} x &0\le x < 2^{n} \\2^{n}-x &-2^{n} < x \le 0 \end{cases}\)

其中,n為x的位數,最終原碼有n+1位。

定義分析:當真值為正時,原碼即為真值的二進制形式,但是在二進制最高位添加一個0作為符號位(定義沒有體現)。當真值為負時,去掉原碼二進制形式的負號,在二進制最高位添加一個1作為符號位。

伸展和收縮:由定義分析可知,x寬度變化時,非符號部分添加或移除高位0(也即整數的二進制形式調整寬度),符號部分不變。在形式上,無論正負,都是在最高位新增或移除0。

例0-1 求\(11_b\)的8位原碼表示
解:為011,擴展到8位為0000 0011。

例0-2 求\(-11_b\)的8位原碼表示
解:100-(-11)=111,擴展到8位為0000 0111。

補碼定義

\(x=\begin{cases} x &0\le x < 2^n \\2^{n+1}+x &-2^n \le x < 0 \end{cases}\)

其中n為x的位數,最終有n+1位(去掉一定為0的最高位)。

定義分析:當真值為正時,保留真值的二進制形式,並在最高位添加一個0作為符號位。當真值為負時,則與10...0(共n+2位)相加,聯系反碼的特點,即將真值負號移除后每位取反,然后加1,然后最高位添加1作為符號位。

伸展與收縮:由定義分析,當真值為正時,則和原碼一致,添加0即可。當為負時,擴展添0,取反后則為添1,加1時不會影響擴展位(因為負值的二進制形式必不全為0),最后保持符號位不變。形式上,正值在最高位添加和刪除0,負值擴在最高位添加和刪除1。

例0-3 求11的8位補碼表示
解:為011,擴展到8位為0000 0011。

例0-4 求-11的8位補碼表示
解:為1000-11=0101,即101,擴展到8位為1111 1101。
還可以利用性質來求:^11=00,00+1=01,添加符號位即101。

一、移位運算

移位的數學意義為乘2和除2。

1.算術移位

識別符號的移位,符號位不變。

編碼 機器數(真值) 算術左移(真值) 算術右移(真值)
原碼 0001(1) 0010(2) 0000(0)
原碼 0100(4) 0000(0) 0010(2)
原碼 1001(-1) 1010(-2) 1000(-0)
原碼 1100(-4) 1000(-0) 1010(-2)
補碼 1001(-7) 1010(-6) 1100(-4)
補碼 1100(-4) 1000(-8) 1010(-6)

2.邏輯移位

不識別符號的移位。

3.移位總結

對於原碼和補碼,算術移位和邏輯移位,左移和右移,僅有負數的補碼形式在右移時填充1,其余均為填0。

對於正數、原碼負數,左移掉1則引起錯誤,右移掉1則引起偏差。
對於補碼負數,左移掉0則引起錯誤,右移掉0則引起偏差

二、加法和減法

1.原碼加、減法

直接根據符號位進行加減即可。將符號位提取出來,然后轉換成“正值+正值”或者“正值-正值”的形式。

參數1(真值) 參數2(真值) 運算 結果(真值)
0100(4) 0001(1) + 0101(5)
0100(4) 1001(-1) + 0011(3)

2.補碼加法

若有 \(A>0,B>0\) , 則

\([A]_補=A,[B]_補=B,\)\([A]_補+[B]_補=A+B=[A+B]_補\)

若有 \(A>0,B<0\) ,則

\([A]_補=A,[B]_補=2^{n+1}+B,[A+B]_補=(A+B)或2^{n+1}+(A+B)\) ,即 \([A]_補+[B]_補=[A+B]_補(mod\space2^{n+1})\)

其它情況類似,不重復。

補碼加法公式

\[[A+B]_補=[A]_補+[B]_補\space(mod\space2^{n+1}) \]

公式說明:
右邊的加法為二進制加法,不考慮符號位。相加后去掉溢出位,即得到補碼加法的結果(當然也是補碼形式)。也即兩個真值的補碼直接相加即得兩個真值的和的補碼(寬度不變)

例2.2-1 計算 \(0001_補+1111_補\)
解:\(0001+1111=1,0000\),去掉溢出位,即結果為 \(0000\)

例2.2-2 計算 \(1111_補+1110_補\)
解:\(1111+1110=11101\),去掉溢出位,即結果為 \(1101\)

3.補碼減法

將減法轉換為加法進行運算。

因為 \(A-B=A+(-B),(B>0)\)

\([A-B]_補=[A+(-B)]_補\)

即補碼的減法公式 $$[A-B]_補=[A]_補 + [-B]_補\space(mod\space 2^{n+1})$$

其中 \([-B]_補=\text{\textasciicircum}[B]_補+1\) 。^表示按位取反。

例2.3-1 計算 \(1111_補-0001_補\)
解:\(\text{\textasciicircum}[0001]+1=1110+1=1111,故1111-0001=1111+1111=11110\) ,去掉溢出位,結果為\(1110\)

三、乘法

1.原碼乘法

將符號位分離,單獨計算正值的乘法,最后將符號計算並賦予結果。

正值的乘法和十進制乘法基本一致,在邏輯上表現為部分積累加並移位。

例3.1-1 計算 \(0011_原\times0010_原\)
解:直觀結果為3x2=6=0110。
原碼乘法計算過程:

\[\begin{aligned} &0011 \\\times\space&0010 \\&0000 \\0&011 \\=\space0&0110 \end{aligned} \]

例3.1-2 計算 \(0111_原\times0111_原\)
解:直觀結果為7x7=49=00110001。
原碼乘法計算過程:

\[\begin{aligned} &0111 \\\times\space&0111 \\&0111 \\0&111 \\01&11 \\=\space11&0001 \end{aligned} \]

2.補碼乘法

先討論補碼乘法乘數為正的情況

\([X]_補\times[Y]_補\) ,假設 \(Y>0\) ,則有

\([X]_補=2^{n+1}+X\space(mod\space 2^{n+1}),[Y]_補=Y\)

\([X]_補\times[Y]_補=(2^{n+1}+X)\cdot Y\space(mod\space2^{n+1}) \\=X\cdot Y\space(mod\space2^{n+1}) \\=[X\cdot Y]_補\space(mod\space2^{n+1})\)

這說明,當 \(Y\) 為正時,補碼的乘法即為各自補碼直接二進制乘法的結果(去除溢出位)。

例3.2-1 計算 \(1111_補\times0011_補\)
解:直觀結果為(-1)x(3)=-3=1101。

\[\begin{aligned} &1111 \\\times\space&0011 \\&1111 \\1&111 \\=\space10&1101 \end{aligned} \]

去除溢出位即為 \(1101\)

再討論乘數為負的情況

此時有 \([Y]_補=2^{n+1}+Y\) ,也即 \(Y=[Y]_補-2^{n+1}\)

\(X\cdot Y=X\cdot ([Y]_補-2^{n+1})\)

\([Y]_補=1y_1y_2...y_n=0y_1y_2...y_n+2^n\)

\(X\cdot Y=X\cdot(0y_1y_2...y_n-2^{n}) \\=X\cdot 0y_1y_2...y_n-X\cdot 2^n\)

\([X\cdot Y]_補=[X\cdot 0y_1y_2...y_n-X\cdot 2^n]_補\)

由補碼減法公式,分解右式,有

\([X\cdot Y]_補=[X\cdot 0y_1y_2...y_n]_補+[-X\cdot 2^n]_補\space(mod\space2^{n+1})\)

\(X=x_1x_2...x_n\) ,則 \([-X\cdot 2^n]_補=[-x_1x_2...x_n0_10_2...0_n]_補 \\=1\text{\textasciicircum}(x_1x_2...x_n)1_11_2...1_n+1 \\=x_n0_10_2...0_n \\=x_n\times2^n\space(mod\space2^{n+1})\)

\(0.y_1y_2...y_n\) 是一個補碼形式的正數,可應用補碼正乘數規律進行分解。故

\([X\cdot Y]_補=[X]_補\cdot 0y_1y_2...y_n+x_n\times2^n\space(mod\space2^{n+1})\)

也即如果乘數為負,則將乘數去掉符號位與被乘數二進制相乘,然后加上 \(x_n\times2^n\) 即得乘積的補碼。

例3.2-2 計算 \(0011_補\times1110_補\) 的8位補碼表示
解:直觀結果為 \(3\times(-2)=-6=1010\)
解法:
\(x_n\times2^n\)=1000

\[\begin{aligned} &0011 \\\times\space&0110 \\0&011 \\00&11 \\=\space01&0010 \\+\space&1000 \\=\space01&1010 \end{aligned} \]

保留4位為 \(1010\),擴展到8位為 \(1111\space1010\)

例3.2-3 計算 \(1110_補\times 1110_補\) 的8位補碼表示
解:直觀結果為 \(-2\times-2=4=0100=0000,0100\)
解法:
\(x_n\times2^n=0\)

\[\begin{aligned} &1110 \\\times\space&0110 \\1&110 \\11&10 \\=\space101&0100 \\+\space&0000 \\=\space101&0100 \end{aligned} \]

保留4位為0100,擴展到8位為 \(0000,0100\)

總結:

\[[X\cdot Y]_補= \begin{cases} [X]_補\times[Y]_補\space(mod\space2^{n+1}) &Y\ge0 \\ [X]_補\cdot 0y_1y_2...y_n+x_n\times2^n\space(mod\space2^{n+1}) \space &Y<0 \end{cases} \]

\(Y=y_0y_1y_2...y_n\),則可以簡化為

\[[X\cdot Y]_補=[X]_補\cdot 0y_1y_2...y_n+y_0\cdot x_n\times2^n\space(mod\space2^{n+1}) \space \]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM