在上一篇寫到馮諾伊曼結構中計算機的硬件組成,第一個就是存儲器,用於存儲數據和程序。那么這一節來梳理一下在計算機中這些數據是怎么存儲的。
一、數字在計算機中是如何存儲的
我們將數字分為整數和實數分別討論
- 整數
有三種存儲方法:無符號表示法、符號加絕對值表示法、補碼表示法
- 無符號表示法只能用於存儲無符號整數,舉例說明如下:
-
符號加絕對值表示法,最高位用於表示符號,0表示正,1表示負。先將絕對值轉化為二進制,二進制不足n-1位的左邊補0,再加上最高位的符號位。舉例說明如下:
2. 實數
實數存儲步驟如下:1.先規范化,移動小數點使得小數點左邊只有一個1 。2.分別對符號、指數、尾數進行處理 。 3.連接符號、指數、尾數
*余碼系統:
寫到這里還是有些晦澀,下面就用我們熟悉的單精度和雙精度來看一下。首先IEEE標准規定,單精度數用32位來存儲,雙精度數用64位來存儲。
對於單精度來說,要用一位來標識符號,用8位來存儲指數,用32位來存儲尾數
對於雙精度來說,要用一位來標識符號,用11位來存儲指數,用52位來存儲尾數
舉例如下:
二、文本在計算機中是如何存儲的
文本不能像數值那樣可以轉換為二進制,那我們是如何處理的呢?基本思想是:用一個二進制數來映射。我們熟悉的ASCII碼就是一種映射對應關系。最開始時ASCII碼是由美國人提出的,在英文中只有26個字母再加上一些符號,一共有127個,占用了最高位為0的8位二進制數就能映射完成,即0000 0000——0111 1111,十進制是0——127.ASCII表如下:
之后歐洲的ISO-8859-1 在ASCII的基礎上,用了最高位為1的8位二進制數。稱為擴展ASCII編碼表。
那漢字是如何存儲呢?我們知道常用漢字有幾千個,用8位二進制肯定無法映射完,所以采用了16位兩個字節,也稱為全角(ASCII 半角)
我們常用的編碼表還有Unicode,其中更加轉換規則的不同,又有UTF-8、UTF-16、UTF-32.
三、音頻在計算機中是如何存儲的
因為音頻會隨着時間或空間連續的變化,存儲時用的是模擬數據。涉及到聲音的采樣,所謂的采樣就是選擇采樣的點來量度聲音的值並記錄下來。
而采樣率就是每秒的采樣數目,之后再經過量化將樣本的值四舍五入為一個整數的過程。再編碼,如果樣本值為正數用無符號表示法,如果樣本值有負數就用符號加絕對值表示法。而用於存儲樣本所用的二進制位數稱為 位深度。位率表示 每秒音頻存儲時所用的二進制位數(位率=位深度*采樣率)
例如:16b*40000個/s=640000b/s=78kB/s
當今主流的音頻編碼標准是MPEG Layer3(MP3)
四、圖像在計算機中是如何存儲的
圖像的存儲主要有兩種:光柵圖和矢量圖
1.光柵圖
- 模擬數據:圖像的顏色隨空間連續變化
- 采樣->掃描、樣本->像素
- 解析度: 每英寸圖像采集多少個像素
- 色彩深度:像素的位數,其中真彩色24位(可表示1677 7216種顏色),索引色8位(可以表示256種顏色)
- 編碼標准有:BMP、TIF、PNG、JPEG
- 缺點:體積大、放大后會失真
2.矢量圖
- 並不存儲圖像的像素,而是存儲繪制圖像的公式及顏色
- 編碼標准:DWG、DXF