【刷題】計算機組成原理--數據的表示及其運算(轉)

原文連接:https://blog.csdn.net/redRnt/article/details/83384255編碼

知識點:spa

1、數的補碼  原碼  移碼錶示.net

無符號數與有符號數

無符號數,即沒有正負號的數,是數的絕對值,在其面前添上正負號,便成了有符號的數。計算機的數均存放在寄存器中,一般咱們稱寄存器的位數爲機器字長,當存放有符號數的時候,須要佔用覺得存放符合位,全部,如若機器字長爲16位,那麼: - 無符號數可表示的範圍爲 0 — 2^(16) -1 - 有符號數可表示的範圍爲 -2^15 — 2^(15) - 13d

15次方是由於符號位佔用了一位。 那麼計算機如何表示有符號數呢?咱們規定,用0表示正號,用1表示負號,這樣符號也就被數字化了,並規定放在有效數據以前,例如: +0.1011 在機器中表示爲0(小數點位置)1011 -1100 在機器中表示爲1,1100(小數點位置) 爲了方便區分手寫的數和將符號數字化的數,咱們把前者稱爲真值,後者稱爲機器數。即 -1100(真值) -> 11100(機器數) 將符號數字化之後帶來了新的問題,運算時,符號位是否參與運算,若是是,那麼如何處理?爲了處理好這些問題,因而就引入了原碼,補碼,反碼和移碼等編碼方式。orm

原碼:blog

原碼,又稱帶符號的絕對值表示,符號位爲0表示正,爲1表示負。用大白話來說,就是直接將數值部分寫成二進制數而後前面添上0或者1,用來表示正負號。內存

 

 

 

 

其實上面的公式咱們只須要了解便可,實際的轉換很簡單 好比數學

X = +1110時 [X]原 = 0,1110io

X = -1110時 [X]原 = 1,1110 (逗號只是爲了區分符號位實際不存在)class

X = 0.1101時 [X]原 = 0.1101

X = -0.1101時 [X]原 = 1,1110(注意不是10.1101,由於0並非有效數據位)。

注意: 1. 若字長爲n+1,那麼原碼整數的表示範圍爲:

2. 原碼中0的表示方式有兩種:

0的原碼錶示方法不惟一

補碼:

計算機中存放的數值方式大多數是用補碼存放,計算(尤爲是減法作加法運算時)時也一般採用補碼運算方式,所以要對補碼很是敏感。

 

 

 

 

對於純整數:

對於純小數:

而對於0而言,

反碼

反碼,一般用來由原碼求補碼或者由補碼求原碼的過渡環節。 咱們先看看數學定義:

對於純小數:

對於純整數:

因此,*記住上面的表示範圍就夠了*,咱們具體看看運算過程,取反操做就是將原碼中的0換成1,1換成0.就完事了。

當X = +1101時,X反 = 0,1101 當X = -1101時,

X反 = 1,0010(當爲負數的時候,符號位不變,數值位執行取反操做)

當X = +0.0110時,X反 = 0.0110 當X = -0.0110時,X反 = 1.1001

對於0來講,反碼的表示方式也有兩種(0,000或者1,111),這就本身去寫了。

0的反碼錶示不惟一

三種之間的關係:

  • 三種機器碼的最高位均爲符號位,符號位與數值位用逗號隔開
  • 當真值爲正時,原碼補碼反碼錶示方式相同。
  • 當真值爲負時,三者表現都不一樣,可是符號位都用1表示,補碼能夠用「原碼求反(不含符號位)後加1」求得。而反碼是原碼除了符號位之外的部分都進行取反操做。
  • 其中0在移碼和補碼中的表示方式都是惟一的。

移碼

當真值用補碼錶示的時候,因爲符號位與數值位一塊兒編碼,這與習慣上表示不一樣,咱們很難從補碼形式上直接判斷真值的大小。可是若是對每一個真值位(注意不包含符號位),都加上一個2^n(n爲整數位),那麼在數軸上,移碼錶示的範圍剛好對應真值在數軸上移動2的n次方個單元。因此叫作移碼。

它經常用來表示浮點數的階數,由於它只能表示整數。 對於移碼來講,0的表示是惟一的,假設字長爲6位(含一個符號位)那麼0的表示爲:

+0移 = (2^5) + 0 =1,00000

-0移 = (2^5) - 0 =1,00000

特色:

1. 0 的表示方式惟一

2. 對於同一個真值,移碼和補碼相差一個符號位,且相反,例如:-11110 補碼爲1,00010,移碼爲:000010

3. 引入移碼是爲了直觀的判斷真值大小,因此移碼大,真值就大

 

2、二進制與16進制

 

3、強制類型轉換

基本數據類型

  1. 整型(int):即定點整數,在寄存器中通常用補碼錶示,其最高位表明符號位,通常是4個字節。具體的位數跟變異平臺有關。
  2. 無符號整數(unsigned):無符號,即不考慮數據位,二進制碼錶示的數就是其值。通常用補碼錶示。
  3. 長整型和短整型(long short):用補碼錶示,這只是位數不一樣罷了(一個長一個短)。
  4. 單精度浮點數和雙精度浮點數(float double):就是咱們平時說的小數點會移動的小數,前面的32位,後面的是64位。

數據間的保留,當計算記過超出機器所能表示的範圍的時候,就會發生「溢出現象」。此時面臨一個問題,那麼是丟掉前面的N位仍是丟掉後面的N位呢?通常咱們選擇保留後面的N位,丟掉前面的N位,若丟掉後發現不能表示正確的結果,說明產生溢出,還有一種狀況就是不受影響了。

強制類型轉換其實是位值不變,只是改變了解釋這些位的方式。

當數據太大,用二進制很差表示的時候咱們選擇用16進制(在以前提到過),分別是0x000286a1,0x86a1,0xffff7751, 0x7751,能夠看出大字節轉向小字節的轉換的規則是:低位直接賦值(賦幾位就看你的數據佔幾位,好比short佔2字節,16位,一個16進制數表明4位2進制數),高位直接截斷。

輸出的數用16進製表示我就不說了,結論:從短字長到長字長的轉換,相應的位值不變,向高位補充的數爲符號位,因此-4321前面的16位都是1,由於它符號位是負號,若是是正號,那就變成0.

 

4、定點數及其加減運算

定點數

定點數:小數點固定在某一個位置的數,有純小數和純整數之分。 假設數據用原碼錶示,那麼: 純小數能夠表示爲

對於純整數,能夠表示爲:

對比前面兩幅圖,只是小數點的位置不同而已,在末尾表示整數,在內部表示小數。那麼爲何表示整數的時候咱們要減去一個1呢?咱們回想一下原碼的表示範圍就會發現,原來是原碼中0能夠有兩種不一樣的表示方式,所以減去一個重複的0.

定點數的運算

定點數的運算主要包括,移位,加,減,乘,除運算。其中移位運算是基礎,加減運算是重點,乘除運算過程繁雜,不大可能在考試中出現。

移位運算

計算機中的定點數的小數點位置都是事先約定好的,因此二進制的小數點移動至關於乘上或者除以2的指數。就很像咱們十進制中的移位:

15 -> 150 //小數點右移一位 至關於乘10

15 ->1.5 //小數點左移一位,至關於除10

那麼類比到二進制來講,就是乘上或者除以2^n。 對於有符號數的移位,咱們稱爲算術移位,移位運算也稱移位操做。

操做的規則以下:

  • 不管是正數仍是負數,移位先後符號位不變
  • 真值爲正的時候,左右移動均添0
  • 若真值爲負,那麼分下面三種狀況: (1) 原碼添0 (2) 補碼左移添0,右移添1 (3) 反碼添1

移位可能帶來的問題:

1. 對於正數而言:左移的時候最高位可能丟1,即把1移出去了,形成溢出。反之,右移有可能把最低位的1移出去,影響數據的精度。

2. 對於負數而言:原碼與上述狀況一致,由於都是添0,而反碼的左移添加的是1,右移也是如此,所以均會形成0的丟失影響精度。對於補碼來講作移高位丟0,右移丟1,精度都不對。

加/減運算

計算機中,加法減法的運算是最基本的運算,其中咱們平時的計算中也能夠知道的是,減法能夠當作加法進行運算。好比: A - B = A +(-B); 因爲咱們前面說過,引入補碼的緣由就是爲了方便計算,因此咱們都採用補碼來進行運算的。

基本公式(或者說理論基礎): [A]補_+ [B] 補= [A + B]補 [A]補 - [B]補 = [A]補 + [-B]補

其中 [-B]補 稱爲求補後的減數,由[B]補,連同符號位在內,每位取反,末位加1所得。

下面看兩道計算題: (1)已知X = +1001 ,Y = -0101,求【X+Y】補,以及X+Y。

這裏,咱們能夠明顯的看到,在使用補碼的運算中,符號位參與了編碼而且一塊兒參與了運算。由於符號位只有一位因此捨棄最高的一位。

(2)已知某機器字長爲8位(含一位符號位),令A = 15,B =24, 求【A+B】補 和(A-B)。

 

溢出判斷

考慮這樣一個問題,機器字長仍爲8位,其中A = -93,B = 45.按照計算規則,咱們有:

很明顯咱們的計算過程是沒有任何的問題的,可是問題出在咱們把符號位參與了運算,咱們根據常識知道結果爲 -138 而138顯然大於2^7 = 128.因此7位數值位不足以容納超過128(不用減一由於補碼錶示的0惟一)的數。這種計算結果超過機器字長的現象咱們稱爲溢出。

1. 肉眼觀察法(作題好用) 這種每每看似很蠢的方式,倒是最直觀也是最有效的方法。就是經過對計算結果的大體估計來判斷是否發生溢出。就好比上題,咱們顯然能夠直接算出 -93-45 = -138,顯然會發生溢出。對於一些判斷溢出的方式每每這種方式最有效。

2. 一位符號位判斷溢出(計算機中判斷方式之一) 咱們先看看溢出的必要條件是什麼,同號相加,異號相減纔有可能發生溢出。所以不管是作加法仍是減法,只要實際參與操做的兩個數(減法爲【-B】補),符號相同,結果又與原操做數符號不一樣,便可以說明發生了溢出。

看下面一道例題: 設某機器字長爲4位(含一位符號位) 當A = 5,B = 4時,有:

當A = -5,B = -4時,有:

這個時候產生了兩個符號位,咱們捨去最高的符號位,剩下0爲符號位。

3. 兩位符號位判斷溢出 兩位符號位的補碼,也稱變形補碼。即在原符號位的前面加多一位符號位,這個加上去的符號跟以前的符號位同樣。

好比: 【X】補 = -0.1011 加多一位符號位變爲 11.1011

【X】補 = 0.1011 加多一位符號位變爲 00.1011

原理:當結果的2位符號位不一樣時(即01或者10),表示溢出,且高位(就是第一位)的符號位永遠表明着真正的符號。 舉個例題:

 

5、浮點數及其加減運算

相對於定點數,浮點數就是小數點能夠浮動的數。一般用來表示數值範圍相差很大的數(好比太陽的質量跟電子的質量相差)。 一般咱們使用這樣的表達式來表示浮點數:

其中,r表示底(由於是指數的形式,通常取2的n次方),E表示階碼(階碼可正可負)。M爲位數(可正可負)。 當r = 10的時候,就是咱們熟悉的科學計數法。在計算機中咱們研究的是r = 2的時候。

規格化數與浮點數的規格化

爲了提升數據的精確度以及便於比較浮點數的大小,在計算機中規定浮點數的尾數用純小數表示。其中尾數最高位爲1的浮點數稱爲規格化數。好比 N = 0.110101 X 2^10.尾數的最高位爲1.因此稱爲規格化數。 爲了提升浮點數的精確度,要求其尾數必須爲規格化數,若是不是規格化數,那麼就要修改階碼的值並同時左右移尾數的方法,使其變爲規格化數。 根據尾數的移動位置,咱們將規格化分爲左規和右規(待會詳細說)。咱們先來看看一個十進制數的移動:

 

 

二進制的移動也是如此的。 所以咱們獲得這樣的結論:

 

從圖中咱們能夠看出至少這幾點:

1. 對於原碼而言,其規格化數的最高位必定是1

2. 對於補碼而言,其規格化數的最高位必定與符號位相反

3. 對於正數,不管其是原碼仍是補碼,規格化後的形式同樣

4. 對於負數,補碼的規格化數是原碼規格化數的除了規格化位之外的所有取反

IEEE754標準

現代計算機的浮點數通常採用IEEE定製的國際標準,這種標準形式以下:

根據浮點數的位數的不一樣,常見的浮點數有三種,短浮點數(float),長浮點數(double),臨時浮點數。具體形式以下:

考試中,最常出現的當屬短浮點數(float)了,由於長浮點數位數較多且原理與短浮點數一致。

1. 最高位爲符號位,佔用一位的空間

2. 階碼爲8位,以移碼的方式存儲,階碼錶示的範圍爲[1 ~ (2^8) - 1],爲何不是0-255?由於全0用來表示無窮大,全0表示非規格化數。

3. 尾數數值位爲23位,在這裏採用了隱藏位策略,因爲咱們規定了尾數最高位爲1,也就是說數值位的第一位總會是1,因此咱們能夠採用23位來表示24位的數(咱們把最高位的數值位隱藏了起來)。即不在23位數值位中存儲這個1(這部份內容常常考!!)

4. 偏置值,對於float數而言,偏置值爲127((2^7) - 1,其中,全一表示無窮大,至於爲何是7次方不是8次方,回顧移碼的定義),表示階碼的移動。在存儲浮點數階碼以前,要將偏置值加到階碼的真值上。好比階碼爲3,那麼移碼錶示的階碼爲: 127 + 3 = 130(80H)。

因此,規格化後,float數的真值爲:

 

其中 s = 0表明正數,s = 1 表明負數。由咱們剛剛討論出來的各個字段的範圍能夠獲得float浮點數的表示範圍: 顯然,當E = 1,M= 0 的時候,浮點數最小, 當 E = 254, M = 111111...(23個1).的時候,浮點數最大;

浮點數的加減運算

同定點數相同,浮點數的加減也採用補碼的形式運算,不一樣的是,浮點數運算的過程較爲麻煩。

1. 對階 即小數點的位置對齊,此時兩個浮點數的階碼相等。所以咱們首先得得出兩個浮點數相差幾階。由小階轉向大階,具體操做是將數值部分右移一位, 此時階碼 +1。(這裏面隱含着捨棄掉有效位的風險)

2. 尾數求和 對階後就好辦了,對階完至關於小數點位置肯定,直接進行定點數的加減。

3. 規格化 規格化,浮點數的規格化一般採用雙符號位,前面咱們已經說過雙符號位這個概念了。

符號位和最高位相同時須要左規,溢出時須要右規   採用雙符號位來計算

4. 舍入 在對階和右規的過程當中,尾數的低位有效位位極可能移丟(由於是小轉大),這時候就會影響精度產生偏差(注意,產生偏差≠結果錯誤)。這樣的溢出咱們稱爲尾數溢出。所以必須對尾數進行舍入。經常使用的方法有:

  • 恆置「1」法:不管右移捨去的是誰,都在末尾添加1
  • 舍「0」入「1」法:右移過程當中,尾數是0則捨去,是1,則尾數末尾加1.(存在尾數再次溢出的風險)

5. 溢出判斷 判斷浮點數的溢出,咱們採用雙符號法,可是與定點數有一點不一樣:當尾數之和出現01.XXXXXX或者10.XXXXXX的時候,並不能直接下結論溢出,應當再右規一次,才能判斷是否真的溢出,且規後發現其階碼的符號位出現01或者10的時候,說明溢出

浮點數的加減運算(實例)

下面是一道2009年的408的考試真題:

咱們先看看,首先第一步沒得說,先寫出X和Y的二進制表示(分數轉二進制很好轉,百度一下就行,有個百度經驗,用咱們平時的同底數冪相除來算,非常方便),注意含有兩個符號位:

而後按步驟作題:

這一步咱們發現這個時候X和Y的階碼已經相同(00,111)了。

 

這裏注意,尾數右規是指尾數部分右規,那麼尾數的符號位也是在尾數中的。

補充知識:

大端對齊與小端對齊

大端對齊模式:是指一個字節中的高位字節放在這個字節區域內的低地址處。

小端對齊模式:是指一個字節中的低位字節放在這個字節區域內的低地址處

將一個32位的16進制數0x12345678存放在內存中(機器按字節編址)

 

 

實際上,小端模式就是從後面往前面存儲的。

經常使用的進制轉換數及一些技巧

 127 = 7FH = 0111 1111B
128 = 80H = 1000 0000B
255 = FFH = 1111 1111B
65535 = FFFFH = 1111 1111 1111 1111B

算大的數能夠用16進制數方便計算,十進制轉二進制也能夠轉換爲16進制再轉換爲2進制。

按邊界對齊

按邊界對齊?簡單的說,對於int型而言,起始地址爲4的倍數;對於char類型而言,起始地址爲任意字節皆可;對於short類型而言,起始地址爲2的倍數;對於結構體而言,對齊方式爲結構體內類型最大的字節量。

強制類型轉換

 第一道題

 

 

分析:
算式顯然是 int = int +short 類型,必定存在強制類型轉換,那麼short ->int 須要添加擴展位,注意,機器中的數用補碼錶示的,因此結果用補碼運算。過程以下:
圖中虛線左邊的是16進制數,右邊是2進制數,因爲答案是16進制數,咱們便化爲16進制數進行加減。
同時,特別注意,負數的補碼,是除了符號位之外取反後加1  正數的補碼等於原碼等於反碼

考點:強制類型轉換,碼制間的轉換運算

 

 127原碼=127補碼=01111111=7F

-9原碼=10001001  -9補碼:11110110+1=11110111=F7

由於機器中數據是用補碼錶示的,因此要用補碼計算

第二道題:

 

 分析:短字節向長字節的轉換,高位的擴展位變爲對應的符號位

 

 65535爲正數,高位補0

第三道題:

 

 

分析:無符號與有符號之間的相互轉換,主要看對符號位的解釋,將符號位當成符號就是有符號數,當成真值解釋就是無符號數。機器中用補碼錶示數。

 

 -32767二進制爲:1111111111111111(二進制)補碼爲1000000000000000+1=1000000000000001 表示爲無符號數是32769 

定點數基本運算及存儲方式

 第一道題

 

 

分析:
這是一道表面考定點數補碼的乘法的問題,可是學過的都知道,乘法的計算太囉嗦了,並且要記憶的東西步驟也極爲麻煩,因此出在考試大題不大可能,出如今選擇題更不可能,而這個題目,一開始就讓咱們計算四個數分別相乘的組合。老老實實作,那麼作完你也應該快考完了。因此換個角度,直接判斷是否溢出,將它們化爲10進制真值,用結果看看能不能用8位表示。說白了仍是考碼制之間的轉換。

考點 :碼制間的轉換與運算,溢出判斷

 

 

第二道題

 

 分析:關鍵詞按字節編址,按邊界對齊,小端方式。咱們知道int是佔用4個字節的,char1個字節,short爲2個字節,加起來要7個字節,可是其實是8個。由於它按邊界對齊。咱們注意到,按順序short應該到D,可是D = 13,不是2的倍數,因此從E開始存儲。
因此過程以下:

 

 

第四道題

 

 分析:若是直接死腦筋算的話,非常麻煩,看看有沒有好的辦法,二進制數對2的乘除,就是移位操做,乘上一個2,左移。除去一個2,右移。實在忘記了,就舉個10進制的例子:
2 X 10 = 20 //至關於將2左移一位
20/10 = 2 //至關於把20右移了一位。這樣就好辦了:

 

 

有符號數移位時,都是按照補碼的形式移位:

右移:最右邊的一位捨棄,最左邊補符號位。

左移:最左邊的一位捨棄,最右邊補0。

 

 

C

103二進制:01100111   -25二進制:10011001   103補碼:01100111 -25補碼:11100111   -y的補碼:11100111

 

 

 A

相關文章
相關標籤/搜索