深入理解計算機系統(五):信息的存儲和表示

深入理解計算機系統(五):信息的存儲和表示

5 人贊了文章

目錄

1、信息的存儲

2、十六進位表示法

3、字

4、數據大小

5、定址和位元組順序

6、數據類型

7、字元串的表示

8、代碼的表示

9、總結

  前面我們介紹了《深入理解計算機系統》第一章的內容----計算機系統漫遊。包括簡單介紹了 Hello World 程序在計算機中是如何運行的,存儲設備的層次結構以及操作系統的抽象概念。第一章的內容只是對很多概念有個簡單了解,所以還是不懂的話也不要緊,後面都會對這些概念進行深入的探究。而這一章我們將介紹《深入理解計算機系統》第二章----信息的表示和處理。

  程序=數據結構+演算法,所以了解數據結構對我們寫程序是非常有幫助的,這一章會詳細探討計算機數據的存儲和表示,其中也會有大量的公式推導。不要害怕看不懂,作者有很多也是第一遍看不懂,但是後面慢慢推導,多看幾遍就看懂了,相信只要具備了高中代數知識的都能看懂。而且了解這些知識之後,你會發現你以前的程序代碼很多都不嚴謹,彷彿在你程序生涯中重新打開了一扇窗。

正文:

1、信息的存儲

  什麼是信息?信息是客觀事物屬性的反映,是經過加工處理並對人類客觀行為產生影響的數據表現形式。

  那麼我們這裡也要提一下什麼是數據,數據是反應客觀事物屬性的記錄,是信息的具體表現形式。任何事物的屬性都是通過數據來表示的,數據經過加工處理後成為信息,而信息必須通過數據才能傳播,才能對人類產生影響。

  例如,數據2、4、6、8、10、12是一組數據,其本身是沒有意義的,但對它進行分析後,就可得到一組等差數列,從而很清晰的得到後面的數字。這便對這組數據賦予了意義,稱為信息,是有用的數據。

  計算機內所有的信息均以二進位的形式表示,也就是由值0和值1組成的序列。大多數計算機使用8位的塊,或者說位元組("位(bit)"是電子計算機中最小的數據單位,每一位的狀態只能是0或1。8個二進位位構成1個"位元組(Byte)"),來作為最小的可定址的存儲器單位,而不是在存儲器中訪問單獨的位。

  也就是說我們訪問計算機最小的單位是八個位構成的位元組,而不是值0或值1的單個位。

程序會將存儲器視為一個非常大的位元組數組,稱為虛擬存儲器(virtual memory)。存儲器的每一個位元組都由唯一的數字來標識,也就是我們說的地址(address),所有可能地址的集合稱為虛擬地址空間(virtual address space)

  比如 C 語言中的一個指針的值,無論它是指向一個整數、一個結構或是某個其他程序的對象,都是某個存儲塊的第一個位元組的虛擬地址。

  編譯器和系統運行時是如何將存儲器空間劃分為更可管理的單元,用來存放不同的程序對象。這個後面會詳細介紹。

2、十六進位表示法

  一個位元組由 8 位組成。在二進位表示法中,它的值域為 00000000——11111111;如果用十進位表示就是0——255。這兩種表示法用來描述計算機中的位模式(計算機中所有二進位的0、1代碼所組成的數字串)來說都不是很方便。二進位表示法太冗長,而十進位表示法與位模式的互相轉化又比較麻煩。這時候 十六進位數產生了,十六進位使用數字『0』~『9』,以及字元 『A』~F』來表示16個可能的值。一般是 0x 或者 0X 開頭。規則是:借一當十六,逢十六進一。

比如十進位數 175,我們用十六進位表示為 0xAF。

  十六進位與十進位、二進位之間的互相轉換這裡就不詳細講解了,相信了解編程的對這個應該是很熟悉了。

3、字

  計算機進行數據處理時,一次存取、加工和傳送的數據長度稱為字(word),一個字通常由一個或多個(一般是位元組的整數位)位元組構成,字的位數叫做字長(word size),每台計算機都有一個字長,用來指明整數和指針數據的標稱大小(nominal size)。由於虛擬地址空間中的地址就是使用一個字來編碼的,因此字長決定了系統的虛擬地址空間的最大大小。

  通俗來講:字長是CPU的主要技術指標之一,指的是CPU一次能並行處理的二進位位數,字長總是8的整數倍,通常PC機的字長為16位(早期),32位,64位。

  比如:作者打開命令提示符,然後輸入 systeminfo,可以看到處理器的位數是 64 位

  也就是說作者的電腦字長為 64 位,不過現在基本上 CPU 都是64 位的,但是為了發揮64位字長的優勢,我們必須與64位軟體相輔相成,比如你得安裝64位操作系統,否則的話,在32位軟體系統中64位字長的CPU只能當32位用。

4、數據大小

  計算機和編譯器支持多種不同方式編碼的數字格式,比如整數和浮點數,以及其它長度的數字。而且由於計算機位數的不同,會造成計算機在各種數據類型分配的位元組數不一樣。下圖是 C 語言在 32位機器和64 位機器上各種類型所分配的位元組數對比。

  我們可以看出,對於長整形( long int)以及字元指針類型(char *)來說,在32位和64位系統下的位元組數是不同的。所以在編程時,考慮到系統的移植性,這是我們必須要考慮的。

  注意:對於指針類型,由於指針指向的是地址,而虛擬空間的大小是由字長決定的。所以在32位系統下,指針大小為4個位元組,在64位系統下,指針大小為8個位元組。

5、定址和位元組順序

  對於跨越多個位元組的程序對象(程序對象指令、數據或者控制信息等,是程序當中對象的統稱)來說,我們需要制定兩個規則:

    ①、這個對象的地址是什麼?

    ②、在存儲器中如何排列這些位元組?

在幾乎所有的機器上,多位元組對象都被存儲為連續的位元組序列,對象的地址為所使用位元組中最小的地址。

比如:假設一個類型為 int 的變數 x 地址為 0x100,也就是說地址表達式 &x 的值是 0x100,那麼,x 的 4 個位元組將被存儲在存儲器的 0x100,0x101,0x102,0x103的位置。

  第一個規則解決了,那麼第二個規則如何排列呢?採用如下兩種方式:

小端法:按照從最低有效位元組到最高有效位元組的順序存儲對象,也就是最低有效位元組在最前面。

大端法:和小端法相反。是按照從最高有效位元組到最低有效位元組的順序存儲對象,也就是最高有效位元組在最前面。

  回到上面的變數 x,如果假設 x 的低位位元組值到高位位元組值分別為 67,45,23,01。那麼用大端法和小端法表示分別如下:

  由於排列位元組的方式有兩種,那麼這就產生問題了。比如當小端法機器產生的數據被發送到大端法機器或者反方向發送的時候就會發現,接收程序里的位元組成了反序。

  為了避免這種情況,網路應用程序的代碼編寫必須遵循已建立的關於位元組順序的規則,以確保發送方機器將它的內部表示轉換成網路標準,而接收方機器則將網路標準轉換為它的內部表示。

6、數據類型

  上面我們在講解第4小點數據大小時,我們給出了 C 語言中很多的數據類型。那麼數據類型到底是什麼呢?

  程序編碼中,計算機是不認識我們所定義的數據類型的。數據類型的出現是為了把數據分成所需內存大小不同的數據,編程的時候需要用大數據的時候才定義大數據類型,然後編譯器編譯標記需要申請大內存,就可以充分利用內存。 例如大胖子必須睡雙人床,就給他雙人床,瘦的人單人床就夠了。

  那麼我們可以根據上面的定址和位元組順序得出,計算機在解釋一個數據類型的值時主要有四個因素:位排列規則(大端或者小端)、起始位置、數據類型的位元組數、數據類型的解釋方式

  對於特定的系統來說,前兩種因素都是特定的,而對於後兩種因素的改變,則可以改變一個數據類型的值的最終計算結果,這就是強制類型轉換。對於大部分高級程序設計語言來講,都提供了強制類型轉換。強制類型轉換有時候會讓結果變的讓人難以預料,所以我們需要慎用。

7、字元串的表示

  在計算機中,對非數值的文字和其他符號進行處理時,要對文字和符號進行數字化,即用二進位編碼來表示文字和符號。其中西文字元最常用到的編碼方案有ASCII編碼和EBCDIC編碼。對於漢字,我國也制定的相應的編碼方案,比如 GBK,GB2312等。

  比如字元 『a』 的 ASCII 碼十進位值為 97,在計算機中用二進位表示就是 01100001

8、代碼的表示

  程序其實就是一個二進位序列的簡單描述,編譯器會幫我們將其翻譯成對應的機器所認識的二進位序列。

9、總結

  本篇博客主要講解了信息在計算機中是如何存儲和表示的,需要注意的是我們訪問計算機最小的單位是八個位構成的位元組,而不是值0或值1的單個位。下一篇博客我們將介紹布爾代數以及C語言中的位運算。

推薦閱讀:

合理用藥核心信息
我國修改行政監察法 泄漏舉報人信息可追刑責
第五節 六親吉凶信息
偷改網購信息冒領貨物構成何罪
10 個可傳遞的信息

TAG:科技 | 信息 | 計算機 |