C语言中整型浮点型在计算机中的存储
? ?第一次寫博客,遣詞造句有點菜,算是一次簡單梳理,慢慢學習人家的博客風格,隨著學習的深入再做修改。
? 本次學習的是C語言在VS下的編譯調試,對于初學者兩說,首先說一下如何監控變量,以及監控變量在內存中的存儲與表示。
?1. 如何監控變量
? 首先從最基本的程序說起,先看一段代碼,
??
#include<stdio.h>int main()
{int i;for (i = 0; i <= 5; i++)printf("%d\n",i);return 0;
}
? 這樣很簡單的一段代碼,我們想隨時監控變量i的值的變換以及在內存的變化,應該如何去做的,首先VS中按F10進入調試狀態,依次打開調試->窗口->監視->監視1,如下圖所示
? 在編輯窗口的下方會出現如下的對話框,在名稱下面輸入i,依次按F10就可以監控變量,這種方式在我們以后的編程查錯時會很方便。
? 2.如何查看變量在內存中的變化
? 還是上面的簡單程序,按F10進入調試狀態,和上述步驟相似,依次打 調試->窗口->內存->內存1,然后出現如下窗口,窗口大小位置都可以進行修改,自己嘗試。
??
此時我們只需要點擊窗口中最下面的內存1和監視1,就可以對變量i的值和內存的監控的隨意切換。但是我們還需要在上面的窗口的地址欄輸入i的地址才可以進行監控,輸入&i
,然后回車。此時地址欄顯示的地址即為i在計算機的存儲地址,然后依次按F10即可監控i對應的地址中值的變化
按幾次F10之后,我們會看到i此時的值為1,下面是此時i的值的監視,和i在內存地址中的值
我們發現i此時值為1,那i在內存中的值是什么呢,看上面內存監視,第一行0x004FFEDC后面對應的八個數字,01 00 00 00 ,我們知道計算機的存儲是二進制存儲,但是二進制表示的話會很長,不利于觀察和計算,于是編譯器就把二進制數轉化成十六進制表示出來,又計算機是小端模式(讀者自行了解),所以將01 00 00 00的十六進制轉化成十進制就是1.我們同樣的方式再來看一下其他數值是否符合這個規則。稍改一下程序,讓i的循環終止時候的值是20,如下圖
需要解釋的一點是,我剛剛把for循環括號里面i<=5,改成了i<=20,此時重新編譯,所以地址改變,但是不影響對內存中值的監視,此時我們看到,當i的值為20時,對應地址中的值是14 00 00 00化成十進制就是20.大家可以按照這個方式,設計一些程序去檢測一下。
3.浮點型在計算機中的存儲
? ?在探討float的存儲呢之前可以先說一下整型在計算機內存中的存儲是補碼形式,大家可以自行試驗一下,包括負數的存儲呢形式,這里不再熬述。
? 有了上述的基礎之后,我們在討論浮點型在計算機中是如何存儲的。
? 首先明白兩個前提條件 (1)實型數據在計算機中以指數的形式保存
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)float在計算機中占四個字節,符號位1位,指數位8位,尾數位23位
? 我們還是通過簡單的例子看看計算機是如何存儲的
#include<stdio.h>int main()
{float i;i = 0.5;return 0;
}
??
? 我們看到當i的值為0.5時,其對應的二進制數是0.1,指數表示應該是1.0*2^-1內存中的值是00 00 00 3f,將它轉換成大端存儲為3f 00 00 00,再轉化成二進制數為0011 1111 0000 0000 0000 0000 0000 ?0000,按照float數據的存儲方式可以將其劃分為1個符號位,8個指數位,和23個尾數位的形式,則其為0 ? ? ?01111110 ? ? ? 00000000000000000000000
我們知道符號位沒錯是0,但是尾數為啥全部為零呢,這是因為,float存儲時,不論怎么做,小數點后面總會出現一個1,這樣計算機就默認一個1.這樣就可以提高一個位的精度。在解決了這個問題以后,我們又要問了,那指數位也不符合我們的要求啊。我們把指數位的數轉化成十進制數為01111110(二進制)->126(十進制)
這是怎么回事呢,指數不是應該是-1嗎,這和我們的126有什么關系嗎,不難發現126=127+(-1)
根據以上分析我們得到計算機存儲float的兩個推斷(1)尾數部分處理成了1.xxx * 2^n的形式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)指數部分在原有的基礎之上加127
下面來舉例驗證一下我們的推論是否正確比如0.25,轉化成二進制就是0.01,根據我們的推論,將其轉換成指數形式就是1.0 * 2^(-2),那么尾數位還全部是0,則指數位應該是-2+127=125,125的二進制表示應該是0111 1101,那么0.25(十進制)在內存中的表示應該是0 ? 01111101 ? 00000000000000000000000 ?我們來通過程序驗證一下,
0.25在內存中的表示為00 00 80 3e,將其裝換成小端模式為3e 80 00 00,再將其轉化成二進制為 ?0 ? ? ? ?01111101 ? ? 00000000000000000000000,和上述我們的推斷一致,證明推斷正確。此時又會問了為什么會采用這種方式進行存儲呢?如果直接按照指數的存儲形式,采用補碼的話,我們必須要思考兩個數字0.0和1.0如何存儲,0.0毋庸置疑是全0,可是1.0按普通補碼的形式,應該是1.0*2^0指數部分也應該是全0,但是這樣不就和0.0矛盾了嗎,所以需要才要指數加127的操作。接下來我們驗證一下0.0和1.0在計算機內存中是如何存儲的。
0.0
0.0是全0
1.0
1.0是00 00 80 3f轉化成小端是3f 80 00 00再轉化成二進制是0 ? ? 01111111 ? ? ?00000000000000000000000再將指數位轉化成十進制是127.此時可以說我們的結論正確了。
? 綜上,float在計算機內存中采取以下方式進行存儲
? ? ? ? ? ? ?1. 尾數部分處理成了 1.xxxx * 2^n的格式
? ? ? ? ? ? ?2. 指數部分在原有指數的基礎上加了 127
以上文字僅是個人拙見,錯誤之處,還望大家指正,本人也會深入學習,爭取在文字表達還有正確性上面更精準一些。
總結
以上是生活随笔為你收集整理的C语言中整型浮点型在计算机中的存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鼋头渚风景区有几个门
- 下一篇: 幽门螺杆菌治要多少钱?知道吗?