1. 程式人生 > >圖解計算機中的數值範圍和浮點運算

圖解計算機中的數值範圍和浮點運算

## 寫在前面 在【程式設計師進階系列】專題的《[圖解計算機中資料的表示形式](https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490388&idx=1&sn=1805a62814452c598c567e65de274c67&chksm=cf55ac55f8222543d1506fb48dcc22c3d5be0a458e3b11a224fd98248e11f86d17468204fcfc&token=1733172899&lang=zh_CN#rd)》一文中,我們詳細的說明了在計算機中資料的表示形式。今天,我們繼續來說計算機中的數值範圍和浮點運算相關的知識。走起,繼續,我們一起進階,一起牛逼。 文章已收錄到: [https://github.com/sunshinelyz/technology-binghe](https://github.com/sunshinelyz/technology-binghe) [https://gitee.com/binghe001/technology-binghe](https://gitee.com/binghe001/technology-binghe) ## 數值的表示範圍 在計算機中,碼制所表示的範圍,可以分為定點整數和定點小數。在定點數中,小數點是固定的。定點整數就是說小數點在最低位的後面,也就是在最右面,此時的小數點可以忽略不寫。定點小數就是小數點在最高位的前面,也就是在最左邊。 **值得注意的是:在定點整數和定點小數中,小數點都不佔位數。所以,小數點在定點整數和定點小數中不會影響數值的範圍。** 我們可以將定點整數和定點小數的取值範圍總結成下表所示。 | 碼制 | 定點整數 | 定點小數 | | ---- | --------------------------- | ------------------------------- | | 原碼 | -(2^n-1^ -1) ~ +(2^n-1^ -1) | -(1-2^-(n-1)^) ~ +(1-2^-(n-1)^) | | 反碼 | -(2^n-1^ -1) ~ +(2^n-1^ -1) | -(1-2^-(n-1)^) ~ +(1-2^-(n-1)^) | | 補碼 | -2^n-1^ ~ +(2^n-1^ -1) | -1~ +(1-2^-(n-1)^) | | 移碼 | -2^n-1^ ~ +(2^n-1^ -1) | -1~ +(1-2^-(n-1)^) | 表格中的n表示機器的字長,也就是用多少位二進位制數表示。 這張表小夥伴們不用死記硬背,說白了,這張表,冰河也記不住,那我們怎麼辦呢?不慌,這裡,我給大家舉一個例子。 ![](https://img-blog.csdnimg.cn/20210124010846912.jpg) 例如,我們這裡使用4位機器字長來表示,為了理解方便,這裡我用四個方框來表示4位二進位制數。 ![](https://img-blog.csdnimg.cn/20210124010855758.jpg) 預設最高位為符號位,如下所示。 ![](https://img-blog.csdnimg.cn/20210124010903765.jpg) 這裡我們先用4位二進位制數表示定點整數,則最小值為1111,最大值為0111。 最小值1111表示如下。 ![](https://img-blog.csdnimg.cn/2021012401091398.jpg) 其轉換成10進位制數為-7。 最大值0111表示如下。 ![](https://img-blog.csdnimg.cn/20210124010921884.jpg) 其轉換為10進位制數為7。 這樣,我們使用4位二進位制數表示的範圍,則可以計算出結果為:-7 ~ 7。也就是 -(2^4-1^ - 1) ~ +(2^4-1^ -1),所以,當使用n位二進位制數表示數值的範圍時,我們可以得出資料的表示範圍為: -(2^n-1^ - 1) ~ +(2^n-1^ -1) **所以,我們根本就不需要記住定點整數和定點小數的取值範圍表,只需要簡單的使用一個實際的二進位制位進行驗算即可得出正確的結果資料。比如,我這裡以4位二進位制位進行驗算舉例。** **還有一點需要注意的是:補碼和移碼比原碼和反碼少一個數,就是-0。另外,驗證定點小數和驗證定點整數的方式相同,小夥伴們可自行驗證定點小數的值,這裡,我就不再贅述。** 如果我們使用8位二進位制數表示,則定點整數的取值範圍為: 1111 1111 ~ 0111 1111 轉換為十進位制數就是: -127 ~ 127,將二進位制數轉換為補碼為:1000 0000 ~ 0111 1111。 **其中,-128的補碼為1000 0000是人為規定的。** 如果使用8位二進位制數表示,則定點小數的取值範圍為: -0.1111 1111 ~ +0.11111111,補碼的範圍為: -1~ + +0.11111111。 **其中,-1的補碼為1000 0000是人為規定的。** ## 浮點數的運算 ### 浮點數的表示 首先,我們先來看下浮點數的表示形式,浮點數的表示形式如下, N = 尾數 * 基數^指數^ 對於浮點數來說,我們最常說的就是圓周率 π,數學上常使用3.14來表示π的值,如果使用科學計演算法的話,我們可以使用形如3.14 * 10^3^ 這樣的數來表示。其中,在3.14 * 10^3^中,3.14表示尾數,10表示基數,3表示指數。 另外,3.14 * 10^3^ 可以寫成多種形式,比如可以寫成 0.314 * 10^4^,也可以寫成0.0314 * 10^5^。 ### 浮點數的儲存格式 浮點數在計算機中的表示中,階碼是帶符號的純整數,尾數為帶符號的純小數。浮點數的表示格式如下所示。 ![](https://img-blog.csdnimg.cn/20210124010944650.jpg) 一個數的浮點數表示不是唯一的。當小數點的位置發生改變時,階碼也會相應的改變。可以使用多個浮點形式表示同一個浮點數。浮點數的數值範圍主要由階碼決定,數值的精度則是由尾數決定的。 ### 浮點數的運算過程 運算的過程要依次經歷對階、尾數計算和結果格式化三個階段。 例如計算:3.14 * 10^3^ + 1.5 * 10^5^的結果資料。 首先,我們需要先進行對階操作,這裡有個原則就是小數向大樹看齊,這裡我們需要將3.14 * 10^3^進行對階操作,轉化成0.0314 * 10^5^,然後與1.5 * 10^5^進行相加操作,得出結果資料1.5314 * 10^5^。 ![](https://img-blog.csdnimg.cn/20210124011055734.jpg) 接下來,我們再來看看浮點數的特點。 ### 浮點數的特點 浮點數的主要特點如下所示。 * 一般尾數使用補碼錶示,階碼使用移碼錶示。 * 階碼的位數決定數的表示範圍,位數越多範圍越大。 * 尾數的位數決定數的有效精度,位數越多精度越高。 * 對階時,小數向大數看齊。 * 對階是通過較小數的尾數右移實現的。 **好了,今天就到這兒吧,我是冰河,大家有啥問題可以在下方留言,也可以加我微信:sun_shine_lyz,我拉你進群,一起交流技術,一起進階,一起