1. 程式人生 > >閱讀《C++Primer》的個人記錄(二)——2.1基本內置類型-關於浮點數、補碼

閱讀《C++Primer》的個人記錄(二)——2.1基本內置類型-關於浮點數、補碼

一個數 過程 取反 反碼 結果 直接 深入 相關 完美解決

學習第二章基本內置類型的過程中,對於書上描寫的單精度浮點數和雙精度浮點數的相關內容和補碼的作用原理沒弄清楚,經過查閱相關資料,整理如下:


現從簡單的補碼說起,
原碼:正數的原碼就是它的本身,負數用最高位是1表示負數
反碼:正數的反碼就是原碼,負數的反碼等於原碼除符號位以外所有的位取反
補碼:正數的補碼和原碼一樣,負數的補碼是負數的反碼加1
【符號位在計算時直接參與運算】
原碼缺點:0有兩種表示,無法處理減法
反碼:可以處理加減法及符號位,但0仍然有兩種表示方式
補碼:完美解決以上問題
逐條分析
原碼加減法運算:略(很顯然除了兩正數相加其他都算不了)
反碼加減法運算:
我們將符號位與絕對值分開討論(數字形如&&&&&&&&)

設一個負數為-X,則其反碼表示的數為-(128-x)
—————正數+負數
現假設一個運算為Y+(-X)【Y為正數】
符號位運算為0+1
絕對值運算為Y+128-X
此時若Y>=X則溢出一位至符號位得符號位為0,同時絕對值位運算結果為Y-X(>0),再將結果取原碼得到符號位為0,絕對值位Y-X。符合預期
此時若Y<X則,將結果取原碼的符號位為1,絕對值為128-(Y+128-X)=X-Y,符合預期
—————負數+負數
現假設一個運算為(-X1)+(-X2)
符號位運算為1+1=0
絕對值位運算為(256-X1-X2)
此時若X1+X2>128則將結果取原碼的絕對值位X1+X2-128,符號位為0。顯然得到的答案不正確,但此類情況對應著溢出情況。所以結果也符合預期
此時若X1+X2<=128則絕對值位溢出一位至符號位得符號位為1,絕對值位為128-X-Y。符合預期
綜上,反碼運算解決了符號位問題。
但0仍然有00000000和10000000兩種表示方法

補碼
1、先解釋——減一個數等同於加其的補碼
設一個負數的原碼為X,反碼為Y,補碼為Z則
X+Y=11111111
Z=Y+1
的X+Z=100000000(1溢出)=00000000
故X=-Z
所以說采用補碼,統一了加減法
2、再解釋補碼的加減運算
略(同反碼類似)


浮點數:
https://www.cnblogs.com/icmzn/p/5060195.html
我覺得這篇文章總結的很到位了,不再贅述【其實自己也沒100%理解透徹233,等學習深入了再回頭看看】


第二篇博客,雖然內容很簡單,但覺得還是有點貨的吧hhh,以後繼續加油吧

閱讀《C++Primer》的個人記錄(二)——2.1基本內置類型-關於浮點數、補碼