深入理解電腦系統(2.1)---資訊的儲存與值的計算

來源:互聯網
上載者:User

標籤:

本文轉載地址:http://www.cnblogs.com/zuoxiaolong/p/computer5.html

 

引言

          我們很難想象,1和0這兩個再簡單不過的數字,給電腦科學帶來了徹底的改變。對於無法與人腦相比的電腦來說,簡單的1和0就是最適合它們的數字。不過1個1或者1個0往往代表不了任何意義,它們必須被賦予上下文,才能有具體的含義。比如,如果我們知道1和0是代表的布爾類型的值,那麼我們就知道1是true,0是false。

          對於二進位所表示的數字來說,主要有三種,即無符號、補碼以及浮點數

          由於電腦對於固定類型的位元字往往都是有位元限制的,比如int類型使用四個位元組(32位二進位)來表示,因此在計算的時候,會發生溢出的情況,最簡單的我們使用不帶正負號的整數0xFFFFFFFF與不帶正負號的整數0xFFFFFFFF相乘,則會產生溢出。

          在產生溢出的時候,得出的結果往往會令人大跌眼鏡。比如兩個正數相乘可能得到負值,兩個正數相加也可能得到負值。而對於不同的電腦來說,由於數值範圍可能有所不同,因此掌握資訊相關的內容對於寫出跨平台的程式來講也是很有協助的。

          

資訊的儲存 

          大多數電腦使用8位的塊,或者說位元組,來作為最小的可定址的儲存空間單位,而不是在儲存空間中訪問單獨的位。換句話說,我們在訪問儲存空間的內容時,最小的訪問單位一般是位元組。

          在我們編程的時候,往往會把虛擬儲存空間(virtual memory)抽象為一個位元組數組,而每一個數組內的元素或者說位元組都有唯一的地址(address),這些地址的集合就被稱作虛擬位址空間。虛擬位址空間是為了給機器級的程式一個概念上的映像,實際上為了提供這個映像,內部的實現是非常複雜的。

       

十六進位標記法

          對於機器來說,可能比較喜歡0和1,但是對於人類這種進階生物來說,1和0就有點不夠看了。因此通常情況下,為了便於閱讀,我們會使用十六進位去表示二進位。1位十六進位的數字可以表示4位位元字,因此一個位元組就可以表示為0x00---0xFF。 

          有關十六進位、二進位以及十進位的轉換,LZ這裡就直接略過了,相信大部分人應該都對這個轉換並不陌生。

 

          每台電腦都有一個字長(word size),用於指明整數和指標資料的標準大小(nominal size)。而由於虛擬位址空間中的地址就是使用一個字來表示的,因此作業系統中的字長就決定了虛擬位址空間的大小。

          比如32位作業系統下,最大記憶體就是232 = 4 * 210 * 210 * 210 B = 4GB,而在64位作業系統下,LZ還專門問了問群裡的猿友,最終得到的結果是234GB。

 

資料大小 

          由於電腦位元的不同,會造成在資料類型的儲存上,採用的位元略有不同,下表是在32位和64位機器下,C語言當中的數字資料類型需要的位元。

           可以看出,對於長整形以及字元指標類型來說,在32位和64位系統下的位元組數是不同的。特別的,對於指標類型來說,所有指標類型在32位下都是4位,而在64位下都是8位,這是由虛擬位址空間的地址位元或者說字長所決定的。

 

定址和位元組順序

          對於跨越多個位元組的程式對象(程式對象指指令、資料或者控制資訊等,是程式當中對象的統稱)來說,我們需要制定兩個規則,才能唯一確定一個程式對象的值。

          比如對於int類型的值0xFF來說,如果我們要根據虛擬記憶體地址去擷取這個整數值,那麼首先我們需要知道它的起始虛擬記憶體地址是多少。另外,我們還需要知道,對於表示int類型的四個位元組來說,這四個位元組的排列順序

          對於第一個問題,由於大部分電腦都採用連續的記憶體位址去儲存一個程式對象,因此我們稱記憶體位址中最小的那個就是該程式對象的起始地址,也是該程式對象的地址。

          對於第二個問題,一般有兩種方式,即大端法和小端法。對於一個整數0x000000FF來說,我們假設它的起始地址為0x1,那麼對於使用大端法規則的系統來說,0x1-0x4的虛擬記憶體所儲存的值依次為0x00、0x00、0x00、0xFF,相反對於採用小端法規則的系統來說,0x1-0x4的虛擬記憶體所儲存的值依次為0xFF、0x00、0x00、0x00。

            

強制類型轉換

          對於一個特定的資料類型來講,電腦在解釋這類資料的值的時候,是根據起始位置以及資料類型的位元來確定的。比如對於無符號int類型的資料來說,倘若我們知道它的起始位置為0x1,而當前的作業系統採取的是大端法規則,假設0x1-0x4的記憶體位址中儲存的位元組依次為0xFF,0xFF,0xFF,0xFF,由此電腦將會幫我們計算出這個無符號int類型的值為232-1,也就是無符號int類型的最大值。

          這其中電腦是根據0x1-0x4這四個位元組上的值,以及無符號int類型的解釋方式,最終得到的這個無符號int類型的值。

          由此可見,電腦在解釋一個資料類型的值時主要有四個因素:位排列規則(大端或者小端)、起始位置、資料類型的位元組數、資料類型的解釋方式

          對於特定的系統來說,前兩種因素都是特定的,而對於後兩種因素的改變,則可以改變一個資料類型的值的最終計算結果,這就是強制類型轉換。對於大部分進階程式設計語言來講,都提供了強制類型轉換。

          比如C語言,我們可以將一個無符號int類型的值強制轉換為其它類型,在轉換之後,對於上面四個因素之中,改變的是最後兩個。為此我們寫一個小程式來看下這個有意思的事情。

#include <stdio.h>int main(){    unsigned int x = 0xFFFFFF61;    int *p = &x;    char *cp = (char *)p;    printf("%c\n",*cp);}

          這是一個簡單的強制類型轉換樣本,可以看到我們將一個無符號int類型的值,先賦給了一個int類型的指標,又強制轉換成了char類型的指標,最終我們輸出這個char類型指標所代表的字元,結果的輸出是一個a。

          輸出a的原因就是由上面的四個因素決定的,我們看這個具體程式上的四個因素。

         1、cp指標的值與x變數的起始記憶體位址相等。(起始位置)

         2、LZ的linux系統是小端標記法,也就是說假設x變數的起始記憶體位址為0x1,那麼0x1-0x4的值分別為0x61、0xFF、0xFF、0xFF。(位排列規則)

         3、char只佔一個位元組,因此會唯讀取0x61這個值。(資料類型的位元組數,或者說大小)

         4、0x61為十進位的97,對應ascii表的話,代表的是字元a,因此最終輸出了a。(資料類型的解釋方式)

         可以看出,強制類型轉換有時候會讓結果變的讓人難以預料,因此這種技巧一般不太推薦使用,但是這種手段也確實是程式設計語言所必需的。

 

字串的表示

         這一點其實上面我們已經提到了,我們知道97其實代表的是字元‘a‘,而這個的由來就是根據ascii表來的,我們在linux系統上可以輸入man ascii命令來查看。

 

代碼的表示

         二進位如何表示代碼?

         其實這些都是編譯器的責任了,我們只需要寫出像上面那個小程式一樣的人們可以看懂的代碼,編譯器便會幫我們將其翻譯成對應的機器所認識的二進位序列。從這個角度上來講,程式語言其實就是一個二進位序列的簡單描述,它提供我們更簡單的編寫電腦可以執行的二進位序列的方式。

 

文章小結

         本次我們初步探索了資訊的儲存以及資訊所代表的結果的計算,這些內容都比較基礎,相信不難看懂。

深入理解電腦系統(2.1)---資訊的儲存與值的計算

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.