考慮到指標的本質是無符號整型,於是歸根結底來說就兩個型別:整型和浮點型儲存:
這個環節以4bit的有符號整型為例現今計算機中的int幾乎全部以補碼形式儲存,是因為補碼自有他的精妙所在,為了闡述這種精妙,需要引入原碼,反碼的概念,但這兩個東西是已經被淘汰掉的儲存形式,因此沒必要記憶它們,目前來看,原碼補碼主要兩個用處:一是做卷子用,二是輔助理解補碼。
上面是4bit的有符號整型【-8~7】的原碼反碼和補碼。
首先簡單粗暴地給出三者的變換規則(考試用):
由於眾所周知的原因,這裡只有負數的變換發展沿革:
這個環節以8bit的有符號整型為例關於具體的三種編碼的出處沒有考究到,但應該是按原碼、反碼、補碼的順序發展的。
背後的邏輯(並沒按這個邏輯講)
所有編碼系統的設計,都在追求連續性和唯一性。原碼:原碼,反碼和補碼的演化,就在不斷提高整數編碼的這兩方面效能。
那麼隨著計算機的發展,人們發現要去處理一些負數的計算,怎麼辦,就拿著計算機的第一位做符號位唄!在原碼的規則下編碼對映是這樣的:
原碼的優點:
原碼的缺點:
反碼:為了給底層的加法運算簡化硬體設計,有了補碼,其對映關係是這樣的:
反碼怎麼來的,就是原碼的數值部分按位取反,
反碼的優點:
反碼的缺點: 補碼
結局是補碼解決了後兩個問題:
從此加法器只要開足馬力求和就好了,編碼的精妙使得硬體很容易實現。但是即便是補碼也還是會有溢位問題,但是!溢位是程式設計師的錯,不是cpu的錯。
前面三種方法在處理臨界點資料的表現:
紅色代表錯了,藍色正確補碼的精妙:
仍以8bit有符號整型為例歷史為什麼會選擇補碼?當然是它解決了以上的種種問題,現在問題是為何它就能解決呢?第一:0的重複對映問題
在補碼的編碼下,原來的0x80被對映給了-128,這樣2^8個編碼有各自的對映物件。
第二:為什麼編碼加減結果正好可以代表對應數的計算結果
補碼編碼精髓在於對負數的處理,負數的補碼被定義成
2^n+x
這樣對於任意的
a,c,(a>0,c>0)
考慮a-ca>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-ca>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^31
float的可表示範圍是計算機的運算方法習題
一.單選題 共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取餘法,十六進製制即...