《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > 計算機系統原理(五) 信息的存儲與值的計算

計算機系統原理(五) 信息的存儲與值的計算

2017-06-22
關鍵詞: 匯編語言

上一章(1.1-1.4)LZ和各位簡單的探討了一下計算機系統中的一些基本概念,本次我們將進入一個嶄新的世界。在1.1那一章當中,我們已經簡單的提及了信息的概念,本次我們會逐漸深入的討論信息的相關內容。

引言

我們很難想象,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命令來查看。

代碼的表示

二進制如何表示代碼?

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

文章小結

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


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 草莓视频成人appios| 99精品视频99| 果冻传媒电影免费看| 免费足恋视频网站女王| 黑人巨大精品欧美一区二区免费| 天天干免费视频| 久99re视频9在线观看| 欧美xxxxx高潮喷水| 人人妻人人澡人人爽人人精品浪潮| 花季传媒下载免费安装app| 国产精品亚洲欧美大片在线观看 | 99国产精品99久久久久久| 无码无套少妇毛多18pxxxx| 亚洲乱码日产精品BD在线观看| 男人添女人30分钟免费| 国产三级在线观看a| 亚洲va在线va天堂成人| 在线看一区二区| 一级中文字幕乱码免费| 日本精品啪啪一区二区三区| 亚洲天堂在线播放| 男人的天堂av社区在线| 国产69精品久久久久APP下载| 久热中文字幕在线精品免费| 国语精品视频在线观看不卡| 一级毛片完整版免费播放一区| 日本精品一区二区三本中文| 亚洲午夜久久久精品影院| 狠狠色婷婷丁香六月| 又粗又硬又大又爽免费视频播放| 韩国三级理论在线电影网| 国产精品一区91| 99久久人妻无码精品系列| 嫩草视频在线看| 中文字幕在线永久在线视频2020 | 88久久精品无码一区二区毛片| 娇bbbb搡bbbb| 中文字幕人妻色偷偷久久| 日韩一区二三区国产好的精华液| 亚洲人成影院77777| 欧美精品久久一区二区三区|