电竞比分网-中国电竞赛事及体育赛事平台

分享

深入理解計(jì)算機(jī)系統(tǒng)——信息的存儲(chǔ)和表示

 youxd 2017-09-14

1、信息的存儲(chǔ)

什么是信息?信息是客觀事物屬性的反映,是經(jīng)過加工處理并對(duì)人類客觀行為產(chǎn)生影響的數(shù)據(jù)表現(xiàn)形式。

那么我們這里也要提一下什么是數(shù)據(jù),數(shù)據(jù)是反應(yīng)客觀事物屬性的記錄,是信息的具體表現(xiàn)形式。任何事物的屬性都是通過數(shù)據(jù)來表示的,數(shù)據(jù)經(jīng)過加工處理后成為信息,而信息必須通過數(shù)據(jù)才能傳播,才能對(duì)人類產(chǎn)生影響。

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

計(jì)算機(jī)內(nèi)所有的信息均以二進(jìn)制的形式表示,也就是由值0和值1組成的序列。大多數(shù)計(jì)算機(jī)使用8位的塊,或者說字節(jié)('位(bit)'是電子計(jì)算機(jī)中最小的數(shù)據(jù)單位,每一位的狀態(tài)只能是0或1。8個(gè)二進(jìn)制位構(gòu)成1個(gè)'字節(jié)(Byte)'),來作為最小的可尋址的存儲(chǔ)器單位,而不是在存儲(chǔ)器中訪問單獨(dú)的位。

也就是說我們?cè)L問計(jì)算機(jī)最小的單位是八個(gè)位構(gòu)成的字節(jié),而不是值0或值1的單個(gè)位。

程序會(huì)將存儲(chǔ)器視為一個(gè)非常大的字節(jié)數(shù)組,稱為虛擬存儲(chǔ)器(virtual memory)。存儲(chǔ)器的每一個(gè)字節(jié)都由唯一的數(shù)字來標(biāo)識(shí),也就是我們說的地址(address),所有可能地址的集合稱為虛擬地址空間(virtual address space)

比如 C 語言中的一個(gè)指針的值,無論它是指向一個(gè)整數(shù)、一個(gè)結(jié)構(gòu)或是某個(gè)其他程序的對(duì)象,都是某個(gè)存儲(chǔ)塊的第一個(gè)字節(jié)的虛擬地址。

編譯器和系統(tǒng)運(yùn)行時(shí)是如何將存儲(chǔ)器空間劃分為更可管理的單元,用來存放不同的程序?qū)ο蟆_@個(gè)后面會(huì)詳細(xì)介紹。

2、十六進(jìn)制表示法

一個(gè)字節(jié)由 8 位組成。在二進(jìn)制表示法中,它的值域?yàn)?00000000——11111111;如果用十進(jìn)制表示就是0——255。這兩種表示法用來描述計(jì)算機(jī)中的位模式(計(jì)算機(jī)中所有二進(jìn)制的0、1代碼所組成的數(shù)字串)來說都不是很方便。二進(jìn)制表示法太冗長(zhǎng),而十進(jìn)制表示法與位模式的互相轉(zhuǎn)化又比較麻煩。這時(shí)候 十六進(jìn)制數(shù)產(chǎn)生了,十六進(jìn)制使用數(shù)字‘0’~‘9’,以及字符 ‘A’~'F’來表示16個(gè)可能的值。一般是 0x 或者 0X 開頭。規(guī)則是:借一當(dāng)十六,逢十六進(jìn)一。

比如十進(jìn)制數(shù) 175,我們用十六進(jìn)制表示為 0xAF。

十六進(jìn)制與十進(jìn)制、二進(jìn)制之間的互相轉(zhuǎn)換這里就不詳細(xì)講解了,相信了解編程的對(duì)這個(gè)應(yīng)該是很熟悉了。

3、字

計(jì)算機(jī)進(jìn)行數(shù)據(jù)處理時(shí),一次存取、加工和傳送的數(shù)據(jù)長(zhǎng)度稱為字(word),一個(gè)字通常由一個(gè)或多個(gè)(一般是字節(jié)的整數(shù)位)字節(jié)構(gòu)成,字的位數(shù)叫做字長(zhǎng)(word size),每臺(tái)計(jì)算機(jī)都有一個(gè)字長(zhǎng),用來指明整數(shù)和指針數(shù)據(jù)的標(biāo)稱大?。╪ominal size)。由于虛擬地址空間中的地址就是使用一個(gè)字來編碼的,因此字長(zhǎng)決定了系統(tǒng)的虛擬地址空間的最大大小。

通俗來講:字長(zhǎng)是CPU的主要技術(shù)指標(biāo)之一,指的是CPU一次能并行處理的二進(jìn)制位數(shù),字長(zhǎng)總是8的整數(shù)倍,通常PC機(jī)的字長(zhǎng)為16位(早期),32位,64位。

比如:LZ 打開命令提示符,然后輸入 systeminfo,可以看到處理器的位數(shù)是 64 位

深入理解計(jì)算機(jī)系統(tǒng)——信息的存儲(chǔ)和表示

也就是說 LZ 的電腦字長(zhǎng)為 64 位,不過現(xiàn)在基本上 CPU 都是64 位的,但是為了發(fā)揮64位字長(zhǎng)的優(yōu)勢(shì),我們必須與64位軟件相輔相成,比如你得安裝64位操作系統(tǒng),否則的話,在32位軟件系統(tǒng)中64位字長(zhǎng)的CPU只能當(dāng)32位用。

4、數(shù)據(jù)大小

計(jì)算機(jī)和編譯器支持多種不同方式編碼的數(shù)字格式,比如整數(shù)和浮點(diǎn)數(shù),以及其它長(zhǎng)度的數(shù)字。而且由于計(jì)算機(jī)位數(shù)的不同,會(huì)造成計(jì)算機(jī)在各種數(shù)據(jù)類型分配的字節(jié)數(shù)不一樣。下圖是 C 語言在 32位機(jī)器和64 位機(jī)器上各種類型所分配的字節(jié)數(shù)對(duì)比。

深入理解計(jì)算機(jī)系統(tǒng)——信息的存儲(chǔ)和表示

我們可以看出,對(duì)于長(zhǎng)長(zhǎng)整形(long long int)以及字符指針類型(char *)來說,在32位和64位系統(tǒng)下的字節(jié)數(shù)是不同的。所以在編程時(shí),考慮到系統(tǒng)的移植性,這是我們必須要考慮的。

注意:對(duì)于指針類型,由于指針指向的是地址,而虛擬空間的大小是由字長(zhǎng)決定的。所以在32位系統(tǒng)下,指針大小為4個(gè)字節(jié),在64位系統(tǒng)下,指針大小為8個(gè)字節(jié)。

5、尋址和字節(jié)順序

對(duì)于跨越多個(gè)字節(jié)的程序?qū)ο螅ǔ绦驅(qū)ο笾钢噶?、?shù)據(jù)或者控制信息等,是程序當(dāng)中對(duì)象的統(tǒng)稱)來說,我們需要制定兩個(gè)規(guī)則:

①、這個(gè)對(duì)象的地址是什么?

②、在存儲(chǔ)器中如何排列這些字節(jié)?

在幾乎所有的機(jī)器上,多字節(jié)對(duì)象都被存儲(chǔ)為連續(xù)的字節(jié)序列,對(duì)象的地址為所使用字節(jié)中最小的地址。

比如:假設(shè)一個(gè)類型為 int 的變量 x 地址為 0x100,也就是說地址表達(dá)式 &x 的值是 0x100,那么,x 的 4 個(gè)字節(jié)將被存儲(chǔ)在存儲(chǔ)器的 0x100,0x101,0x102,0x103的位置。

第一個(gè)規(guī)則解決了,那么第二個(gè)規(guī)則如何排列呢?采用如下兩種方式:

小端法:按照從最低有效字節(jié)到最高有效字節(jié)的順序存儲(chǔ)對(duì)象,也就是最低有效字節(jié)在最前面。

大端法:和小端法相反。是按照從最高有效字節(jié)到最低有效字節(jié)的順序存儲(chǔ)對(duì)象,也就是最高有效字節(jié)在最前面。

回到上面的變量 x,如果假設(shè) x 的高位字節(jié)值到低位字節(jié)值分別為 67,45,23,01。那么用大端法和小端法表示分別如下:

深入理解計(jì)算機(jī)系統(tǒng)——信息的存儲(chǔ)和表示

由于排列字節(jié)的方式有兩種,那么這就產(chǎn)生問題了。比如當(dāng)小端法機(jī)器產(chǎn)生的數(shù)據(jù)被發(fā)送到大端法機(jī)器或者反方向發(fā)送的時(shí)候就會(huì)發(fā)現(xiàn),接收程序里的字節(jié)成了反序。

為了避免這種情況,網(wǎng)絡(luò)應(yīng)用程序的代碼編寫必須遵循已建立的關(guān)于字節(jié)順序的規(guī)則,以確保發(fā)送方機(jī)器將它的內(nèi)部表示轉(zhuǎn)換成網(wǎng)絡(luò)標(biāo)準(zhǔn),而接收方機(jī)器則將網(wǎng)絡(luò)標(biāo)準(zhǔn)轉(zhuǎn)換為它的內(nèi)部表示。

6、數(shù)據(jù)類型

上面我們?cè)谥v解第4小點(diǎn)數(shù)據(jù)大小時(shí),我們給出了 C 語言中很多的數(shù)據(jù)類型。那么數(shù)據(jù)類型到底是什么呢?

程序編碼中,計(jì)算機(jī)是不認(rèn)識(shí)我們所定義的數(shù)據(jù)類型的。數(shù)據(jù)類型的出現(xiàn)是為了把數(shù)據(jù)分成所需內(nèi)存大小不同的數(shù)據(jù),編程的時(shí)候需要用大數(shù)據(jù)的時(shí)候才定義大數(shù)據(jù)類型,然后編譯器編譯標(biāo)記需要申請(qǐng)大內(nèi)存,就可以充分利用內(nèi)存。 例如大胖子必須睡雙人床,就給他雙人床,瘦的人單人床就夠了。

那么我們可以根據(jù)上面的尋址和字節(jié)順序得出,計(jì)算機(jī)在解釋一個(gè)數(shù)據(jù)類型的值時(shí)主要有四個(gè)因素:位排列規(guī)則(大端或者小端)、起始位置、數(shù)據(jù)類型的字節(jié)數(shù)、數(shù)據(jù)類型的解釋方式

對(duì)于特定的系統(tǒng)來說,前兩種因素都是特定的,而對(duì)于后兩種因素的改變,則可以改變一個(gè)數(shù)據(jù)類型的值的最終計(jì)算結(jié)果,這就是強(qiáng)制類型轉(zhuǎn)換。對(duì)于大部分高級(jí)程序設(shè)計(jì)語言來講,都提供了強(qiáng)制類型轉(zhuǎn)換。強(qiáng)制類型轉(zhuǎn)換有時(shí)候會(huì)讓結(jié)果變的讓人難以預(yù)料,所以我們需要慎用。

7、字符串的表示

在計(jì)算機(jī)中,對(duì)非數(shù)值的文字和其他符號(hào)進(jìn)行處理時(shí),要對(duì)文字和符號(hào)進(jìn)行數(shù)字化,即用二進(jìn)制編碼來表示文字和符號(hào)。其中西文字符最常用到的編碼方案有ASCII編碼和EBCDIC編碼。對(duì)于漢字,我國(guó)也制定的相應(yīng)的編碼方案,比如 GBK,GB2312等。

比如字符 ‘a(chǎn)’ 的 ASCII 碼十進(jìn)制值為 97,在計(jì)算機(jī)中用二進(jìn)制表示就是 01100001

8、代碼的表示

程序其實(shí)就是一個(gè)二進(jìn)制序列的簡(jiǎn)單描述,編譯器會(huì)幫我們將其翻譯成對(duì)應(yīng)的機(jī)器所認(rèn)識(shí)的二進(jìn)制序列。

9、總結(jié)

本篇博客主要講解了信息在計(jì)算機(jī)中是如何存儲(chǔ)和表示的,需要注意的是我們?cè)L問計(jì)算機(jī)最小的單位是八個(gè)位構(gòu)成的字節(jié),而不是值0或值1的單個(gè)位。下一篇博客我們將介紹布爾代數(shù)以及C語言中的位運(yùn)算。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多