補碼和浮點數表示

原文:https://www.cnblogs.com/lihaichao/p/9627405.html

一.模。

  模是指一個計量系統的計數範圍。如時鐘等。計算機也是一個計算器,它也是有一個計量範圍,即都存在一個「模」。 
  如時鐘的計量範圍是0~11,模 = 12。 
  32位計算機的計量範圍是2^32,模 = 2^32。 
html

二.補數。

假設當前時針指向11點,而準確時間是8點,調整時間可有如下兩種撥法:spa

  • 一種是倒撥3小時,即:11-3=8
  • 另外一種是順撥9小時:11+9=12+8=8

  在以模爲12的系統中,加9和減3效果是同樣的,所以凡是減3運算,均可以用加9來代替。對「模」12而言,9和3互爲補數(兩者相加等於模)。因此咱們能夠得出一個結論,即在有模的計量系統中,減一個數等於加上它的補數,從而實現將減法運算轉化爲加法運算的目的。.net

       在補碼中,0有惟一的表示。code

三.補碼原理。

 # 按以上理論,減一個數等於加上它的補數,因此
 5 - 3
 # 等價於 
 5 + (16 - 3)   // 算術運算單元將減法轉化爲加法
 # 用二進制表示則爲:
 0101 + (10000 - 0011)
 # 等價於
 0101 + ((1 + 1111) - 0011)
 # 等價於
 0101 + (1 + (1111 - 0011))
 # 等價於
 0101 + (1 + 1100) // 括號內是3(0011)的反碼+1,正是補碼的定義
 # 等價於
 0101 + 1101
 # 因此從這裏能夠獲得
 -3 = 1101
 # 即 `-3` 在計算機中的二進制表示爲 `1101`,正是「 -3 的正值 3(`0011`)的補碼(`1101`)」。
 # 最後一步 0101 + 1101 等於
 1001

 

四.移碼。

   移碼經常使用來表示浮點數的階碼。IEEE754中解碼用移碼錶示。htm

   

 

    其中X爲真值,與補碼相比,數值位徹底相同,符號位相反。blog

五.浮點數據表示。

 

 

     階碼部分E採用的是移碼。io

    爲何採用移碼?微博

  原文:https://blog.csdn.net/a7515780/article/details/60469155class

單精度浮點數(32位),階碼(後面的用偏移階碼錶示,其實在IEEE754表示單精度浮點數都是一個概念)8位,那麼原來8位二進制數有符號二進制表示範圍是-127~127,可是IEEE爲了避免在階碼中引入符號位,且8位偏移階碼(階碼中二進制數爲無符號數)範圍是1~254(爲何不包括0和255?後面說),所以引入偏移碼(移碼),在有符號位的二進制基礎上加127,那麼就有了偏移階碼範圍0~254,可是0不合法,後面說,所以偏移階碼範圍是1~254。    爲何是127呢??是否是不少人都有這個疑惑。   加上127不就從原來的二進制有符號轉變爲無符號了嘛。IEEE不就是爲了避免在階碼E中不引入符號位才加的127嘛。基礎

填坑,爲何範圍是1~254?

由於0用8位階碼用全0表示,255用8位階碼用全1。      出現全0,尾數M全0,符號位爲0,爲正0,符號位爲1,爲負0(IEEE754規定的浮點數有正0負0之分),偏移階碼出現全1,尾數M全0,符號位S爲0,爲正無窮大,符號位S爲1,爲負無窮大。  這就是爲何不把0和255放入偏移階碼範圍中的緣由。

即:全尾數全0或全1時表示其餘特殊意義的數。

我以前也在糾結這個問題,糾結在爲何是127不是128或者其餘數,其實很簡單,就是爲了將有符號轉換爲無符號。   但願我這篇微博能夠幫到還處於迷茫的小夥伴。

  而移碼是真值加一個偏移值獲得的。

  • 對於單精度而言。偏移值由上獲得爲:2^7 - 1= 127.
  • 對於雙精度而言。偏移值由上獲得爲:2^10 -1 = 1023

 因此一個浮點數可表示爲:

 

不一樣狀況:

 

六.十進制浮點數真值轉換爲單精度IEEE754.

 

七.單精度IEEE754轉換爲十進制浮點數真值.

 

例子:

相關文章
相關標籤/搜索