機器中的數值表示

2021-10-06 18:46:00 字數 3407 閱讀 8523

定點數定點純整數的表示

反碼:signed

補碼:signed

移碼:signed

有符號補碼和無符號數相互轉換

定點純整數的擴充套件

定點純整數的截斷

定點整數運算

二進位制乘法:signed

二進位制除法:signed

浮點數乘除法

tips

這裡對下文會用到的幾個溢位名詞作解析

機器中的小數很少用定點純小數表示,一般用ieee 754標準的浮點數表示法進行表示

注意 求和符號的上下界,定點純整數的原碼表示和定點純小數不同

原碼相加結果
原碼相加需要分離符號位

補碼相加結果
原碼常用於表示浮點數階碼

移碼相加結果
[x+y]移碼 = [x]移碼+[y]補碼

理解原碼需要區分符號位和數值位才能進行正確的乘除運算;反碼、移碼、補碼都不能直接進行乘除運算。

對於全體整數,原碼和反碼有兩種編碼(+0,-0),移碼和補碼有唯一編碼

加減法中只討論加法。

處於區分在真值視角下的運算和在二進位制視角下的運算。

三位有符號數的範圍是-4 ~ 3,無符號數的範圍是0 ~ 7

由於7對於有符號數是上溢,故需要−2w

-2^w

−2w,-9對於有符號數是下溢,故需要+2w

+2^w

+2w

單符號位法

變形補碼法

若是unsigned的二進位制乘法,則相當於兩者的符號位都是0,且原碼輸入和補碼輸入是相同的(因為正數的原碼 = 補碼),故unsigned的二進位制乘法相當於原碼並行乘法

原碼並行乘法

補碼並行乘法

unsigned是無符號位、原碼的signed的二進位制除法的特殊形式

對於乘除而言,補碼的數值位都不能直接參與運算,故在運算前都需要將補碼的數值位轉換位原碼後進行運算,符號位抑或。故這裡直接討論原碼除法運算

原碼除法是指原來的兩個數,如果是原碼,則數值位可以直接參與運算;如果是補碼,需要將補碼數值位轉換為原碼進行運算。

但在手算過程中容易發現,除法運算實際上是減法運算+移位操作,減法運算就需要把兩個數按照補碼的方式進行運算。

故原碼除法實際上是輸入和輸出為原碼,內部運算機制為補碼

下面只根據原本兩個數的數值位進行討論(例如:當談論除數時,指的是除數的數值位,即絕對值)

原碼除法:恢復餘數法

原碼除法:加減交替法

ieee 754

非規格化: f=

x1x2

x3..

.xn=

σi=1

nxi2

−i

f = x_1x_2x_3...x_n = \sigma_^x_i2^

f=x1​x

2​x3

​...

xn​=

σi=1

n​xi

​2−i

//a = 0.2,無法被表示的例項

#include

intmain

(int argc,

char

const

*ar**)

//執行結果:

0x3e4ccccd

0.200000

printf

("%d\n"

, a ==

0.2)

;printf

("%.10f\n"

, a)

;//執行結果:

00.2000000030

我們常說的小數不能直接判等是由於精度不足,指的就是ieee 754浮點表示法的精度不足。

定點整數只需要考慮溢位,而浮點數需要同時考慮精度溢位

注意!!!浮點數運算中的規格化與ieee 754標準中的規格化浮點數沒有絲毫關係!!!

階碼可以表示為:

尾數可以表示為

當給定x和y的原碼表示時(往往此時階碼和尾數都是原碼),題目中的上述要求僅僅是需要先將x和y轉換成相應格式,然後用這些格式參與運算,得到相應格式的結果,再將結果轉換為原碼。但可以在草稿紙上按照熟悉的方法(推薦將階碼和尾數都用變形補碼)計算,再換回題目要求的格式寫在答題卷上

推薦:階碼的移碼和補碼用雙符號位處理,並換成變形補碼進行計算;尾數的原碼和補碼用雙符號位處理,並換成變形補碼計算。

先換成補碼在草稿紙上運算,在作業紙上寫題目要求的碼制

對階
注意 補碼和移碼的溢位條件不同

可以先將移碼換成補碼在草稿紙上運算(對階),在換回移碼寫到作業紙上。則階碼的溢位也可以通過補碼的溢位觀察出來,這樣就無需記憶移碼的溢位和計算公式了。

尾數求和

規格化

這裡只討論尾數變化,階碼要隨著尾數變化

由於原碼和補碼可以相互轉換,且正數的原碼就是補碼,故我們只討論補碼的規格化。我們可以將兩個數的加減完全轉化成兩者的補碼的加減,然後規格化,最後再根據題目要求的碼制格式轉換回去就可以了。

這種尾數的處理辦法和階碼一樣,則尾數的溢位也可以直接通過用補碼運算時的溢位情況獲知。

檢查溢位

檢查捨入

獲取結果階碼相加

尾數相乘

用變形補碼法觀察溢位是最保險的

變形補碼的理論基礎:由signed定點純整數的擴充套件可知,補碼擴充套件符號位不會改變實質。變形補碼的本質就是擴充套件1位符號位

定點數或浮點數運算,全部用雙符號位補碼進行運算(在作業紙按照題目要求的碼制書寫)是最保險的。

C 中數值極限的表示

關於c 中的數值極限的表示 c 中的數值極限可以利用 class numeric limits 表示,常用方法如下 include include include using namespace std int main cout numeric limits max max max min max...

用 表示數值

tchart功能就是將一組資料,按圖形顯示出來。一 定義三全陣列 a array 0.60 of string 專案 名稱 c array 0.60 of integer 專案 數值 color array 0.60 of tcolor 色彩 二 向陣列中賦值 三 顯示 chart1.seriesl...

顏色的數值表示方法

顏色的數值表示方法 說起來汗顏,老是以做設計自居,可今天看到了 666,居然不知道這個表示什麼顏色,還奇怪怎麼用三個數字表示顏色。由baidu大哥告訴我,原來這也是一種表示方法,總共有五種,以下列舉,供參考 顏色的表示共有五種方式。rrggbb 以三個00到ff的十六進製值分別表示0到255十進位值...