计算机组成原理(哈工大刘宏伟)135讲(三)
第6章 計算機的運算方法
6.1無符號數和有符號數
無符號數
有符號數
1.機器數與真值
2.原碼表示法
3.補碼表示法
- 由于無論是正數還是負數,得到的補數都可能是0101,為了區分是正數還是負數,要添加一個符號位
- 27(符號位)+27(因為是負數,求補數時的方法)+(?1011000)2^7(符號位)+2^7(因為是負數,求補數時的方法)+(-1011000)27(符號位)+27(因為是負數,求補數時的方法)+(?1011000)
- 當然,在引入符號位后,模數也隨之而變化了(不然符號位就沒啦)
-
由負數的補碼得到原碼,也可以 ”符號位不變,其余按位取反然后加一“,然后再由原碼得到真值
-
如果是 “-0”,根據定義,求補碼就是“2(因為小數點前為1位)加上x這個值“,然后2加上負的零,實際上是“10.00000”,然后因為符號位只有一位(取模),前面的1要丟掉,x的補碼就是“0.00000”
-
可以發現,正零和負零的補碼形式相同,原碼形式不同(無論是小數零還是整數零)
-
補碼 最大的好處就是 把減法轉化成加法
4.反碼表示法
-
在原碼轉成補碼的過程中,如果我們不加那個1,就是反碼;實際上相當于,把這個模進行了減一,因此模變成了2n+1?12^{n+1}-12n+1?1
-
在補碼中我們是模2的,反碼是最后那個加一我們不做了,那么如果說數值部分的長度是n位的話,我們最后那個加一,在小數中實際上加的是2?n2^{-n}2?n,因為,反碼的模就是2?2?n2-2^{-n}2?2?n
三種機器數的小結
-
由補碼得到原碼再得到真值
5.移碼表示法
- 由真值得到移碼,對正數和負數不做區別
- 移碼中,符號位為0的反而是負數,符號位為1的反而是正數
- 通常情況下,因為移碼的大小很好判斷,所以移碼我們通常用來表示浮點數據表示的階碼部分,階碼都是整數,所以,移碼的定義中,也只給出了整數形式的定義,沒有給出小數形式的定義
6.2 數的定點表示和浮點表示
定點表示
- 定點表示 指的是 小數點按約定方式標出。在計算機中,沒有專門的硬件來表示小數點,小數點的位置是由計算機體系結構設計人員在設計計算機體系結構的過程中約定的,在硬件實現和軟件實現中都要遵守這個約定
- 根據 小數點約定位置的不同,主要會有兩種形式
浮點表示
-
規格化數 就是 數值的最高位是非零的,也就是在二進制表示中這一位是1
-
用有限的數據來表示無限多的實數
-
“保證數的最大精度的前提下“,誰影響數據的精度?—尾數的長度,如果要保證數的最大精度,必需讓尾數盡可能的長,因此,要縮短階碼的位數,因此,階碼用4位,這樣一共拿出來了6位,剩下的都是尾數部分,因此,尾數部分的長度是18位
-
對浮點數進行規格化表示 的作用就是 盡可能保證數據的精度,如果不進行規格化,尾數的小數點后面可能有若干個零,放在計算機中,尾數的長度是有限的,超出給定長度的那部分尾數的值將被扔掉,會嚴重影響數據的精度,因此,我們要讓它有效的位數盡可能多,因此,采用規格化形式
-
這里說的“尾數最高位為1“中1指的是真值為1
-
如果尾數采用四進制,那么兩位二進制數表示了一位四進制數,要想進行規格化的話,那就是尾數的最高的兩位不能全部為0
-
在進行尾數的規格化中,如果尾數的基值為4,那么每次移位的時候,無論左右,都要移動兩位二進制數的位置,表示的是一位四進制數,這里“左移兩位”指的是二進制的兩位
舉例
-
如何處理除以128,每右移一位相當于除以2,因此,除以128相當于右移7位,那么,我們就可以得到它的二進制形式了
-
在由 定點表示 轉化為 浮點規格化形式,首先要確定 小數點所在的位置,-58是一個整數,那么小數點在定點表示最后面,要把它變成浮點表示,小數點要放在哪個位置呢?“規格化”
-
在表示 浮點機 中的 階碼 時,不要忘了題面要求階碼數值部分為4位,因此,在符號位和逗號后面還要補零
-
又要求 階碼用移碼表示,尾數用補碼表示;因此可以用在浮點機的補碼表示的形式下,給出這個值,因為尾數部分都是用補碼表示相同的,階碼部分不同要用移碼表示,移碼和補碼的區別就在于符號位,數值部分完全相同,符號位改成1
-
當階碼用移碼表示時,階碼是-16,在移碼中我們加的是2^n,那么階碼是-16,如果用移碼來表示,階碼就是全零
IEEE 754 標準
6.3 定點運算(上)
移位運算
-
負數時,反碼中的1相當于真值中的0
-
進行左移一位時,機器數的符號位(0)不動,而是逗號后面的最高位會被丟掉,最低位空出來的位,因此是大于0的,我們要給它補零
-
進行右移一位時,…,因為大于零,所以我們在前面補零
-
左移一位時,符號位不動,移位的僅僅是數值部分,最高位被移掉,雖然移掉的是一個1,但是因為是補碼,這個1相當于是0,右側空出來的一位,根據前面講的填補代碼的規則,給它添上零
-
右移一位時,最高位出現了一個空,根據前面補碼的移位規則,這個空位我們要填1,這個1對應了真值中的0
-
負數的補碼中,如果左移丟1,這個1對應了真值中的0,所以丟掉1沒有任何問題;反而如果丟掉0就會出錯
-
負數的補碼中,如果右移丟1,這個1對應了真值中的1,所以丟掉之后會影響精度
-
算術移位的符號位不動,符號依然保持著原來的符號,所以算術移位是有符號數的移位
加減法運算
- 其實這兩道題都有一個漏洞,那就是沒有考慮機器字長,比如-9的二進制形式不一定是圖上這種,數值位不一定是4位
-
本題隱含條件 整數型定點機
-
練習1 :這個題中假設,機器字長為5位,包括1位的符號位,而且這臺機器是一個存小數的定點機;為什么答案是錯誤的呢?十進制求出結果應該是2016\frac{20}{16}1620?,這個結果是大于1的,超過了小數定點機能夠表示的范圍,這種情況叫做 溢出
-
練習2 :這個結果依然是錯的。如果機器字長為8位,含有1位符號位,是整數型的定點機,用補碼表示的話,表示范圍是-128到+127,一共256個數,那么真實計算結果是-138,超出了這種機器數表示方式能夠表示的范圍,仍然是 溢出
-
如果一正一負相加不會發生溢出
-
比如最高有效位的進位是1,對應了兩個正數相加;符號位進位是0;發生溢出
-
比如最高有效位的進位是0,對應了兩個負數相加;
-
0、0和1、1這兩種情況,都不會發生溢出,對應了兩個相同符號的兩個數相加,或者是符號不同的兩個數相加,
-
在 結果的雙符號位不同(10或者01),也就是說溢出的情況下,雙符號位的第一個符號位是我們真正的符號位,第二個符號位實際上是運算的數值溢出的部分
乘法運算
總結
以上是生活随笔為你收集整理的计算机组成原理(哈工大刘宏伟)135讲(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十届蓝桥杯大赛软件赛省赛 C/C++
- 下一篇: 浙江农林大学2021年新生杯程序设计竞赛