計算機的運算方法

2021-10-24 12:06:24 字數 3669 閱讀 6498

考慮到指標的本質是無符號整型,於是歸根結底來說就兩個型別:整型和浮點型

儲存:
這個環節以4bit的有符號整型為例

現今計算機中的int幾乎全部以補碼形式儲存,是因為補碼自有他的精妙所在,為了闡述這種精妙,需要引入原碼,反碼的概念,但這兩個東西是已經被淘汰掉的儲存形式,因此沒必要記憶它們,目前來看,原碼補碼主要兩個用處:一是做卷子用,二是輔助理解補碼。

上面是4bit的有符號整型【-8~7】的原碼反碼和補碼。

首先簡單粗暴地給出三者的變換規則(考試用):

由於眾所周知的原因,這裡只有負數的變換

發展沿革:
這個環節以8bit的有符號整型為例

關於具體的三種編碼的出處沒有考究到,但應該是按原碼、反碼、補碼的順序發展的。

背後的邏輯(並沒按這個邏輯講)

所有編碼系統的設計,都在追求連續性和唯一性。

原碼,反碼和補碼的演化,就在不斷提高整數編碼的這兩方面效能。

原碼:

那麼隨著計算機的發展,人們發現要去處理一些負數的計算,怎麼辦,就拿著計算機的第一位做符號位唄!在原碼的規則下編碼對映是這樣的:

原碼的優點:

原碼的缺點:

反碼:為了給底層的加法運算簡化硬體設計,有了補碼,其對映關係是這樣的:

反碼怎麼來的,就是原碼的數值部分按位取反,

反碼的優點:

反碼的缺點: 補碼

結局是補碼解決了後兩個問題:

從此加法器只要開足馬力求和就好了,編碼的精妙使得硬體很容易實現。但是即便是補碼也還是會有溢位問題,但是!溢位是程式設計師的錯,不是cpu的錯。

前面三種方法在處理臨界點資料的表現:

紅色代表錯了,藍色正確

補碼的精妙:

仍以8bit有符號整型為例

歷史為什麼會選擇補碼?當然是它解決了以上的種種問題,現在問題是為何它就能解決呢?

第一:0的重複對映問題

在補碼的編碼下,原來的0x80被對映給了-128,這樣2^8個編碼有各自的對映物件。

第二:為什麼編碼加減結果正好可以代表對應數的計算結果

補碼編碼精髓在於對負數的處理,負數的補碼被定義成2^n+x

這樣對於任意的a,c,(a>0,c>0)考慮a-c

a>c結果肯定是正數 a-c=a+(2^n-c) mod 2^n=a-c 沒問題

an=2n+(a-c) 沒問題,結果正好就是a-c的補碼

第三:為什麼反碼不能解決這兩個問題

負數的反碼是對x<0,其補碼為2^n-1+x

同樣對於任意的a,c,(a>0,c>0)考慮a-c

a>c結果肯定是正數 a-c=a+(2^n-1-c) mod 2^n=a-c -1 這顯然不行

an=2n-1+(a-c) 沒問題,這種情況下是正確的

當然容易知道a=c時也是正確的

補充:

餘數定理:

如果a ≡ b (mod m),c ≡ d (mod m) 那麼:

(1)a ± c ≡ b ± d (mod m)

(2)a * c ≡ b * d (mod m)

補碼的對映關係如圖:

小結:int的情況只不過時數量上的擴充,至於無符號數就是跟鐘錶完全一樣的迴圈轉圈

以單精度浮點數為例

ieee754格式

日常開發中不可能只用整型,肯定有使用小數的場景,給你乙個32bit的位置,可以用差不多40億個不同的數編碼,那麼如何對映這些編碼對映的範圍更廣呢?答案是採用浮點數格式,也即

這就是現行ieee754標準進行對單精度浮點數的定義:

這樣的乙個32位編碼對映到的小數是這樣的:

補充概念:

練習:用ieee754單精度表示-0.75(10進製)

化為二進位制小數:-0.11

用規格化科學記數:-1.1x2^(-1)

對比上面的式子寫出三個部分的值

s=1fraction=0.10000000000000000000000(小數點後23位)

exponent=-1+bias=-1+127=126=01111110(二進位制)

乙個蘿蔔乙個坑

二進位制轉十進位制浮點數

0xc0a00000

寫成二進位制並按格式拆分:1 10000001 0100000000000000000000

寫出三部分的值

s=1fraction=0.25

exponent=129

計算十進位制浮點數

-1.25*2^2=-5

為什麼偏移是127?為什麼要把指數偏移一下?

浮點數運算

練習:0.5和-0.4375相加(使用4位精度)

先將二者化為規格化科學記數法:0.5=1.000x2^-1-0.4375=-1.110x2^-2

將最小指數的數的有效位進行右移,直到其指數和較大數匹配:-1.110x2^-2=-0.111x2^-1將有效數相加-0.111x2^-1 + 1.000x2^-1 = 0.001x2^-1將和規格化並檢查上溢和下溢0.001x2^-1 = 1.000x2^-4捨入和 這裡不需要捨入1.000x2^-4 =0.0625(10進製)

0.5和-0.4375相乘(使用4位精度)

將不帶偏階的指數相加 (-1)+(-2)= (-3)

有效數相乘:1.000 *1.110=1.110x2^-3

檢查有效數的積是否規格化,這裡是的;檢查指數是否上溢和下溢,這裡127>-3>-126,沒問題

對積捨入

定符號 結果-0.21875

總結:int的範圍是-2^31~2^31-1,兩個特殊點是0xffffffff=-1,0x80000000=-2^31float的可表示範圍是

計算機的運算方法習題

一.單選題 共18題,36.0分 1若 x 補 0.1101010,則 x 原 2.0分 a 1.0010101 b 1.0010110 c 0.0010110 d 0.1101010 正確答案 d 我的答案 d 得分 2.0分 2已知x為整數,且 x 補 10011011,則x的十進位制數值是 2...

6 計算機的運算方法

6.3 定點運算 6.4 浮點四則運算 解析一下 這是從數學上描述的負數的原碼的表示 x的原碼的真值 2 n的真值 x的真值,也就是2 n的真值 減去 x的真值得到的數的二進位制表示就是x的原碼。比如 2,2 2 2 6 所以 2的原碼表示 是6的原碼110 x是負數時,x 2 n x 2 n 2 ...

計算機運算方法和運算部件

整數十進位制轉二進位制有模2取餘法。小數轉二進位制有乘2取整法。二進位制轉十六進製制 二進位制從低位到高位四個為一組 高位不夠補0 轉換為十六進製制。反之為十六進製制轉換二進位制。十進位制轉十六進製制 第一種先把十六進製制轉換為二進位制,再把二進位制轉換為十六進製制。第二種模16取餘法,十六進製制即...