計算機組成原理 - 定點整數的原碼補碼運算(待驗證)
〇、環境
對象 | 運算 |
---|---|
定點整數原碼、定點整數補碼 | 移位、加、減、乘、除 |
原碼定義:
\(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})\)
其它情況類似,不重復。
即補碼加法公式:
公式說明:
右邊的加法為二進制加法,不考慮符號位。相加后去掉溢出位,即得到補碼加法的結果(當然也是補碼形式)。也即兩個真值的補碼直接相加即得兩個真值的和的補碼(寬度不變)。
例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。
原碼乘法計算過程:
例3.1-2 計算 \(0111_原\times0111_原\) 。
解:直觀結果為7x7=49=00110001。
原碼乘法計算過程:
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\) 。
總結:
記 \(Y=y_0y_1y_2...y_n\),則可以簡化為