理解int的存儲方式以及VS二進制編輯器的使用

  此文先講int數據的存儲(大小端)問題,然後簡單講一下二進制編輯器的使用,針對像我一樣的初學者,懂了的大神可以直接關掉

       直接說結論,大家都知道一個int數據是4字節,一個字節是8個比特位,也就是一個int類型佔了4*8=32個比特位,這也就是int類型範圍的由來。一個內存地址對應的空間就是一個字節,一個int數據會對應四塊連續的內存空間,接下來用數字1來說明,要存儲int類型數字1,那麼在這32個比特位中只有一個是1,其餘都是0。結論:這個1是存儲在第一塊內存空間裏的,也就是說,這四塊內存空間依次是

00000001  00000000  00000000  00000000

,這個1其實並不是在最後,(也就是數據高位存儲在內存地址大的地方),同理256存儲的方式是

00000000  00000001  00000000  00000000

,先理解這種存儲方式就好了,後面會用二進制編輯器來驗證。

我們先用代碼來創建一個存有一個int數字的文件,代碼如下:

    #include<cstdio>
     
    int main() {
        int n = 1;
        FILE *f = fopen("test", "wb+");
        fwrite(&n, 4, 1, f);
        fclose(f);
        return 0;
    }

 (  這裏是C++,C語言的話把第一行換成stdio.h應該就行了)這幾個函數可以搜一下,此段代碼的作用就是創建了一個名爲test的文件,寫入了一個int數字1。如果無法創建也可以往下看,不影響
此時會在工程目錄下生成一個名爲test的文件,此文件沒有後綴名,可以右鍵看一下屬性,是佔用了4字節,剛好是一個int的大小,如果你用記事本打開,會看到不是一個正常的字符。這裏代碼寫入的1實際是ascii碼,如果代碼用n=49,即可用記事本看到數字1。我們用n=1繼續。接下來我們用二進制編輯器來打開它。

        此處用vs2017自帶的二進制編輯器,打開方式爲“文件->打開->文件”,到了選擇文件的窗口,選擇剛纔創建的test文件,可以看到打開按鈕旁邊有個三角箭頭,點一下,如圖(我這裏的vs是英文),中文可能是“打開爲”

打開方式選擇二進制(我這裏英文是Binary Editor,中文版自己看一下是哪個。。)

  會看到如下圖

        先介紹一下,前面連續的8個0是地址,可以先簡單地理解成行號,或者直接忽視掉也可以,然後後面是

01  00  00  00

        這裏第一個01就是對應前面所說的第一塊內存空間,就是1存在int的第一個字節中,可是這裏只看到了兩位,不是應該有8位嗎?實際上這裏是以十六進制顯示的,8個比特位就是2的8次方,剛好與這裏的兩個16進制,也就是16*16相等,估計沒人想對着一堆0和1修改(我理解的也就是二進制編輯器用起來實際爲十六進制編輯器...)。可以看到後面有四個點,這四個點對應的就是這四個字節所存儲的數字ascii碼所對應的字符,有點繞,因爲這裏目前只有0和1,ascii碼對應的字符不能顯示,只好顯示了小點,也就是說,如果把第一個01改爲十進制的49,右邊的第一個點就可以顯示出來字符‘1’,但是不要忘記這裏是十六進制,所以應該把49換算成十六進制,也就是十六進制的31,修改好後如下圖,右邊順利顯示出來了‘1’:(修改有難度,多摸索幾次找規律)

        接下來嘗試修改成下圖所示:

     這裏對應的十進制數值應該是2的8次方也就是256,然後點擊保存,此時test文件裏存儲的是int類型數字256,大小依然4字節,注意這裏說是int類型是因爲可以這樣理解,並不是指文件裏面存的就是一個int,文件裏只不過是存了8*4=32個比特位而已,所以我們同樣可以理解成存了4個char類型數據,或者兩個short類型數據。如果把上面數據後面兩個字節刪掉,如下圖所示:

 此時可以看到只剩下了兩個字節的數據(那個豎線是光標),右邊的點也只變成了兩個,此時保存,你會發現test文件大小變成了兩字節。

        最後額外說一點txt文件吧,新建一個空的txt文件,是0字節,打一個數字1,文件是1字節。在這裏輸入進去的實際是一個字符‘1’,對應的ascii碼是49,用二進制編輯器打開這個文件,發現是下圖,

      十六進制的31對應的十進制剛好是49,ascii碼剛好對應字符‘1’。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章