補碼和浮點數表示


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

一.模。

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

二.補數。

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

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

  在以模為12的系統中,加9和減3效果是一樣的,因此凡是減3運算,都可以用加9來代替。對“模”12而言,9和3互為補數(二者相加等於模)。所以我們可以得出一個結論,即在有模的計量系統中,減一個數等於加上它的補數,從而實現將減法運算轉化為加法運算的目的。

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

三.補碼原理。

 # 按以上理論,減一個數等於加上它的補數,所以
 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中解碼用移碼表示。

   

 

    其中X為真值,與補碼相比,數值位完全相同,符號位相反。

五.浮點數據表示。

 

 

     階碼部分E采用的是移碼。

    為什么采用移碼?

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

單精度浮點數(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轉換為十進制浮點數真值.

 

例子:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM