原文: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轉換為十進制浮點數真值.
例子: