?

數據在計算機內存中的存儲形式及實驗驗證

2018-06-05 10:33李瑞
科教導刊·電子版 2018年2期
關鍵詞:存儲單元數據內存

李瑞

摘 要 對于現實生活中我們所接觸到的數據類型,在計算機中均是通過二進制的形式,進行存儲和計算的。對于計算機專業的學生,首先需要理解和掌握的就是各種數據類型在計算機中的存儲形式和處理方式,從而實現更好的掌握計算機底層的工作原理以及數據處理的各種機制。本文簡要的對相關內容進行的介紹,并通過C語言進行了計算、驗證。

關鍵詞 數據 內存 存儲單元 小端存儲

中圖分類號:TP391.41 文獻標識碼:A

1數值型數據在計算機中的存儲

1.1存儲概述

現將C語言作為例子,其所有的基本數據類型,均是符合人類世界和自然世界的邏輯進行設計的。在計算機中,并沒有int、float等等類型,均是以0和1 進行表示和描述的,所有的數據也是通過0和1在計算機中進行存儲的。

理解數據的存儲,最根本的問題是要了解二進制,即計算機中數據存儲的最基本形式。

進制,通俗講是規定的進位的方法,對于任何一種的進制—X進制,均是表示逢X進一位,例如十進制是逢十進一,八進制是逢八進一,二進制是逢二進1一等等。對于不同的數據,有以下方面的共同之處:(1)每一種進制都有各自的符號集,例如二進制的基本符號是0和1,十進制的基本符號是0,1,2,3,4,5,6,7,8,9等等;(2)對于每一種進制,均使用位置表示法,也就是說在在不同位置的數,其代表的值有所不同,例如,對于十進制數1234.55,可以表示為:1234.55 = 1*10^3+2*10^2+3*10^1+4*10^0+5*10^(-1)+5*10^(-2)。對于任何一種進制的數值,均可以按照不同的權值進行展開。

在人類的思維模式中,十進制是普遍的使用方式,計算機是使用二進制的,編程人員則需要與計算器直接進行交流。舉個例子,現給一串二進制數“0000 1010 1111 0101 1000 1111 1111 1111”,任何人看到都會不知所云,如果直接使用十進制,則不能準確的表達計算機的思維方式,因此出現了八進制和十六進制,十六進制應用的更加廣泛一些,對于前文中提到的二進制數,轉換成八進制,32./3余2,則還需要在前面加0,但是轉換成十六進制,32/4=8,可以直接寫成十六進制對應的八個數值代表的字符串,更加的簡單和明了。

1.2整數在計算機中的存儲方式

在32位的計算機系統中,對于整數的范圍是指,也即是說-2147483648~ +2147483647。

對于整數的原碼,是通過二進制的形式表現的,二進制的最高位是符號位,對于正數,符號位是0,對于負數,符號位是1。數值X的原碼記為[X]原,如果在計算機中的表示長度為n,最高位表示符號位,其余位表示數值的絕對值。原碼在計算正數與正數的時候,不存在問題,但是出現負數的時候,則會出現問題。

數值X的反碼記作[X]反,如果在計算機中的表示長度為n,最高位表示符號位,正數的反碼與原碼相同,負數的反碼是原碼的絕對值按位取反得到。

數值X的補碼記為[X]補,如果在計算機中的表示長度為n,最高位表示符號位,正數的補碼與原碼、反碼相同,負數的補碼是其反碼的末尾加1。在計算機中表達帶符號的整數時,一般均采用補碼,補碼的引入,符號位不再約束計算,補碼的最高位雖然是1,但是不再是符號位,而是普通的二進制位,可以參與運算。

舉個例子,對于+70和-70,其在32位的計算機系統中,其原碼分別表示為:

[+70] 原碼 = 0000 0000 0000 0000 0000 0000 0100 0110,

[-70] 原碼 = 1000 0000 0000 0000 0000 0000 0100 0110。

對于整數0,其原碼有以下兩個:

[+0] 原碼 = 0000 0000 0000 0000 0000 0000 0000 0000,

[-0] 原碼 = 1000 0000 0000 0000 0000 0000 0000 0000。

而對于整型類型的數,其在計算機內存中是以補碼的方式進行存儲的。正數的補碼就是自己的原碼,而對于負數,其補碼是符號位之外的各位取反之后再加1。舉個例子,在32位的計算機系統中,+70和-70的補碼可以分別表示為:

[+70] 補碼 = 0000 0000 0000 0000 0000 0000 0100 0110 = 0x46,

[-70] 補碼 = 1000 0000 0000 0000 0000 0000 1011 1010 = 0xffffffba。

通過編寫C語言程序,可以驗證正屬于以及負整數在計算機中是如何存儲的,具體的程序設計如下:

﹟include”stdio.h”

main()

{

int i = -70;

printf(“%d在計算機內存儲和計算形式為:%x\n”,i,i);

printf(“%d在計算機內存儲和計算形式為:%x\n”,-i,-i);

}

在Linux系統中,通過gcc編譯器,編譯之后的結果顯示為:

-70在計算機內存存儲和計算形式為:ffffffba

70在計算機內存和計算形式為:46

通過程序語言,直觀的顯示驗證了對于正整數,其在內存中是以原碼的形式進行存儲的,對于負整數,其在內存中是以補碼的形式進行存儲的,兩者在計算機的內存中都占據了四個單位的存儲單元。

1.3小數在計算機內存中的存儲

對于實數,其在計算機中的存儲形式有浮點型(float)和雙精度型(double)兩種類型,雙精度型的存儲空間以及計算精度均要高于浮點型。在IntelCPU架構的系統中,是以小端模式(Little Endian)進行存放的,具體是指低字節存放在低地址,一個存儲單元中存儲一個字節的內容。對于目前使用的C/C++編譯器,其使用的均是EEE定制的標準浮點格式,也就是 我們經常所說的二進制科學表示法,實數S可以表示為S = M * 2N,主要包括三部分內容:符號位、尾數(M)以及階碼(N)。對于浮點型(float)的實數,其存儲空間占據了32位的存儲單元,其中符號位占據了1位,尾數占據了32位,階碼占據了8位;對于雙精度型(double)的實數,其存儲空間占據了64位的存儲空間,其中符號位占據了1位,尾數占據了52位,階碼占據了11位。

階碼:通過移碼進行表示,對于浮點型(float)類型的數據,其規定的偏置量是127,階碼有正值有負值,八位二進制的表示范圍是從-128到127;對于雙精度型(double)類型的數據,其規定的偏置量是1023,其表示范圍是從-1024到1023。對于浮點型類型的數據,假設階碼的真實值是2,加上127,就是 129,相應的階碼是10000001。

尾數:部分的二進制位即小數點后面的二進制位,是有效數字位,規定尾數M的整數部分一直是1,故1不再進行保存。

舉個例子,推導浮點型實數125.5,在計算機中是如何進行存儲的。首先把125.5轉換為二進制的形式,即為1111101.1,因為尾數部分固定是1,所以表示為1.1111011*2^6,故階碼是6,加上127,則是133,對應的二進制表示為10000101,尾數把整數部分的1去掉,則表示為1111011,位數一共是23位,在其后面補0,則表示為11110110000000000000000。因此125.5對應的二進制形式是:

010000101 11110110000000000000000

這在計算機內存中占據了4個單位的內存單元,

可以將浮點數換算為十六進制數,例如將5.2f換算成十六進制數,首先,正數部分5,其四位的二進制數是0101,其次小數部分0.2,對應的二進制數是0.001 1001 1……這里的省略號表示沒有辦法計算完,是無限循環,因此只取32位,則為:101.001 1001 1001 1001 10011,使用科學計數法表示為:1.01001 1001 1001 1001 10011*22,考慮到偏置量,正數最高位為1,即為0 1000 0001 0100 1100 1100 1100 1100 110,其對應的十六進制是40A66666,這就是5.2的最終整數形式。

同時,還可以將十六進制數轉換為浮點數。例如對于十六進制0X40A66666,換算成二進制為0100 0000 1010 0110 0110 0110 0110 0110,最高位是0,所以是正數,接下類的八位換成十進制就是12910,進行逆運算,129 – 127 = 2,指數為2,剩下的23位補1得到:1010 0110 0110 0110 0110 0110,加上小數點得到1.010 0110 0110 0110 0110 0110 * 22,通過科學技術法,得到相應的二進制小數為101.0 0110 0110 0110 0110 011 0,正數部分是5,小數部分進行逆運算,可以表示為0 .0 0110 0110 0110 0110 0110,得到其浮點數是5.1999998。

2非數值型數據在計算機內存中的存儲

2.1 ASCⅡ字符

對于標準ASCⅡ字符和擴展ASCⅡ字符,均是一個字節的編碼,所以標準ASCⅡ字符和擴展ASCⅡ字符在計算機內存中均是占據了一個單元的存儲單元。舉個例子,對于字符‘A,其在計算機內存中占據一個單元的存儲單元,相應的值是0x41;對于字符‘a,其在計算機內存中占據一個單元的存儲單元,相應的值是0x61;對于字符‘$,其在計算機內存中占據一個單元的存儲單元,相應的值是0x24。

2.2 漢字

其實,對于任何字符,都可以類似于漢字這樣,進行相應的編碼,編碼方式無論是GB2312,還是UNICODE編碼,還是UTF16編碼,其在內存中是如何進行存儲的,都可以通過這樣的方式進行相應的分析和討論。

3結束語

所有的基本數據類型,均是符合人類世界和自然世界的邏輯進行設計的。在計算機中,并沒有int、float等等類型,均是以0和1 進行表示和描述的,所有的數據也是通過0和1在計算機中進行存儲的,因此,了解不同類型的數據類型具有十分重要的意義。本文對我們接觸到的各種類型的數據,例如正整數、負數、雙精度小數、浮點小數、非數值型等等,進行了簡單的介紹,概述了其在計算機系統中占據的內存存儲空間大小,本文簡要的對相關內容進行的介紹,并通過C語言進行了計算、驗證。對于計算機專業及想了解相關知識的學生,首先需要理解和掌握的就是各種數據類型在計算機中的存儲形式和處理方式,從而實現更好的掌握計算機底層的工作原理以及數據處理的各種機制。通過本文的研究,希望對于計算機專業的學生有一定的借鑒和指導意義。

參考文獻

[1] 吳艷婷,方賢進. 數據在計算機內存中的存儲形式及實驗驗證[J].安慶師范學院學報(自然科學版),2016,22(04):152-154.

[2] IKIPEDIA,W.Twos complement [DB/OL]. https : // en . wikipediaorg / wiki / Two % 27s_compkement.

猜你喜歡
存儲單元數據內存
一種28 nm工藝下抗單粒子翻轉SRAM的12T存儲單元設計
外部高速緩存與非易失內存結合的混合內存體系結構特性評測
“春夏秋冬”的內存
一種成本更低的全新靜態DRAM存儲單元
MiR-125a-5p is Upregulated in Plasma of Residents from An Electronic Waste Recycling Site
淺談計量自動化系統實現預購電管理應用
基于內存的地理信息訪問技術
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合