計(jì)算機(jī)編程語(yǔ)言的基本數(shù)據(jù)類型設(shè)計(jì)

在計(jì)算機(jī)編程語(yǔ)言的學(xué)習(xí)中,很多初學(xué)者甚至好幾年的老手對(duì)基本類型的應(yīng)用和理解都存在著一些模糊的地方,今天我就拿C語(yǔ)言和Java語(yǔ)言中的基本類型來(lái)舉例,深度解剖它們的設(shè)計(jì)原理。

一、計(jì)算機(jī)存儲(chǔ)處理信息的單位

  • 1bit(位): 表示一個(gè)二進(jìn)制數(shù)碼0或1,是計(jì)算機(jī)存儲(chǔ)處理信息的最基本的單位(存儲(chǔ)單元)。這里的bit和電信號(hào)之間通過(guò)高(1),低(0)電平進(jìn)行對(duì)應(yīng)處理,讓硬件做出相應(yīng)的操作。

  • byte(字節(jié)):一個(gè)字節(jié)由8個(gè)位組成 。它表示作為一個(gè)完整處理單位的8個(gè)二進(jìn)制數(shù)碼?,F(xiàn)目前計(jì)算機(jī)上多使用《美國(guó)國(guó)家信息交換標(biāo)準(zhǔn)代碼》——ASCII編碼(由美國(guó)國(guó)家標(biāo)準(zhǔn)委員會(huì)制定),如:字符“A”的二進(jìn)制編碼是“0100 0001”即41H或65D “#”的二進(jìn)制編碼是“0010 0011”即23H或35D,一個(gè)漢字是兩個(gè)字節(jié),一個(gè)英文字母是一個(gè)字節(jié),標(biāo)點(diǎn)符號(hào)也是一個(gè)字節(jié)。
    注意:因?yàn)閎yte是一個(gè)完整處理單位(這個(gè)一個(gè)規(guī)定設(shè)計(jì)),所以編程語(yǔ)言中數(shù)據(jù)類型的長(zhǎng)度基本單位為字節(jié)。

  • 字(Word):16個(gè)位為一個(gè)字(即兩個(gè)字節(jié)是一個(gè)字) ,它代表計(jì)算機(jī)處理指令或數(shù)據(jù)的二進(jìn)制數(shù)位數(shù),是計(jì)算機(jī)進(jìn)行數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)處理的運(yùn)算單位。通常稱16位是一個(gè)字,32位是一個(gè)雙字,64位是兩個(gè)雙字。

注意:
1、bit的設(shè)計(jì)是根據(jù)二進(jìn)制0,1設(shè)計(jì),電信號(hào)和數(shù)字通信間通過(guò)高低電平進(jìn)行通信,而高低匹配二進(jìn)制的1,0。
2、一個(gè)存儲(chǔ)單元(一個(gè)byte)都有一個(gè)地址,是一個(gè)整數(shù)編碼,可以表示為二進(jìn)制整數(shù)。編程語(yǔ)言中的變量和主存儲(chǔ)器的存儲(chǔ)單元相對(duì)應(yīng)。變量的名字對(duì)應(yīng)著存儲(chǔ)單元的地址,變量?jī)?nèi)容對(duì)應(yīng)著單元所存儲(chǔ)的數(shù)據(jù)。(C語(yǔ)言中的指針,地址,值)
3、一個(gè)byte的完整處理單元(存儲(chǔ)/讀取/解析),是CPU與存儲(chǔ)器間的地址總線和數(shù)據(jù)總線寬度設(shè)計(jì)的基本單元,個(gè)別芯片會(huì)出現(xiàn)地址總線20位,大部分都是一個(gè)byte的倍數(shù),因?yàn)轳T諾依曼結(jié)構(gòu)是順序執(zhí)行指令。

二、計(jì)算機(jī)中的字長(zhǎng),尋址空間,字符的概念

  • 字長(zhǎng):是CPU的主要技術(shù)指標(biāo)之一,指的是CPU一次能并行處理的二進(jìn)制的位數(shù),字長(zhǎng)是8的整倍數(shù),通常的PC機(jī)的字長(zhǎng)為16位,32位,64位。一臺(tái)16位字長(zhǎng)的PC機(jī)可以直接處理216(65536)之內(nèi)的數(shù)字,對(duì)于超過(guò)此范圍的數(shù)字需要分解的方法來(lái)處理。32位機(jī)比16位機(jī)優(yōu)越的原因之一就在于它在一次操作中能處理的數(shù)字大,32位機(jī)字長(zhǎng)的PC機(jī)能直接處理的數(shù)字為232(40億),能處理的數(shù)字越大,則操作的次數(shù)就越少,從而系統(tǒng)的效率就越高。

  • 尋址空間:要看處理器的地址總線的位數(shù),而不是它的字長(zhǎng)。如Intel P4處理器字長(zhǎng)為32位,地址總線也是32位。8086的數(shù)據(jù)總線為16為,地址總線為20位(則可尋址的內(nèi)存空間為220=1MB)。新興的64位處理器的數(shù)據(jù)總線為64位,地址總線大部分是32位。再看地址總線與尋址范圍的關(guān)系,存儲(chǔ)單元是以Byte為單位,N根地址總線能夠訪問(wèn)2N個(gè)存儲(chǔ)單元,于是有32位地址總線可訪問(wèn)2^32個(gè)存儲(chǔ)單元,即4GB。

  • 字符:是可使用多種不同字符方案或代碼頁(yè)來(lái)表示的抽象實(shí)體。例如,Unicode UTF-16 編碼將字符表示為 16 位整數(shù)序列,而 Unicode UTF-8 編碼則將相同的字符表示為 8 位字節(jié)序列。公共語(yǔ)言運(yùn)行庫(kù)使用 Unicode UTF-16(Unicode 轉(zhuǎn)換格式,16 位編碼形式)表示字符。

注意:
1、字長(zhǎng)取決于它的通用寄存器、內(nèi)存儲(chǔ)器、ALU的位數(shù)和數(shù)據(jù)總線的寬度。字長(zhǎng)=2^數(shù)據(jù)總線位數(shù)
2、尋址空間就是CPU一次性能夠?qū)ふ叶啻髢?nèi)存,然后再?gòu)倪@些內(nèi)存地址中找到匹配的地址。尋址空間=2^地址總線
3、字符是字符方案的實(shí)體,字符方案(字符編碼)是人類語(yǔ)言和計(jì)算機(jī)二進(jìn)制編碼間的協(xié)議方案。

三、C與Java基本數(shù)據(jù)類型設(shè)計(jì)

編程語(yǔ)言如果需要做和人類直接溝通,那么需要對(duì)我們認(rèn)知的數(shù)字和字符進(jìn)行定義,所以編程語(yǔ)言的基本數(shù)據(jù)類型也分為字符和數(shù)字

C/Java基本類型占位及取值范圍比較

注意:
1、不同編譯系統(tǒng),整數(shù)的存儲(chǔ)長(zhǎng)度不同。對(duì)于16位的編譯系統(tǒng),int為2字節(jié);而對(duì)于32位的編譯系統(tǒng),int為4字節(jié)。可以用sizeof運(yùn)算符測(cè)試。
2.、而且在C/C++中可以通過(guò)類型修飾符signed和unsigned用于修飾字符型和整型。
3.、對(duì)于C/C++語(yǔ)言long是32bit是歷史的包袱, long long是8字節(jié)

四、對(duì)于float和double的取值范圍和精度

首先我們了解下它們的內(nèi)存結(jié)構(gòu),如下圖所示:


float和double的結(jié)構(gòu)
  • 1、范圍
    float和double的范圍是由指數(shù)的位數(shù)來(lái)決定的
     float取值范圍  2^(-2^7~+2^7-1)
     double取值范圍  2^(-2^10~+2^10-1)
  • 2、精度
    float和double的精度是由尾數(shù)的位數(shù)來(lái)決定的。浮點(diǎn)數(shù)在內(nèi)存中是按科學(xué)計(jì)數(shù)法來(lái)存儲(chǔ)的,其整數(shù)部分始終是一個(gè)隱含著的“1”,由于它是不變的,故不能對(duì)精度造成影響。
    float的精度2^23=8388608   7位有效數(shù)字  
    double的精度2^52=4503599627370496  15位有效數(shù)字

注意
1、因?yàn)楦↑c(diǎn)數(shù)精度左邊還有一個(gè)隱含著的1所以 float 7-8位有效數(shù)字 double 15-16位有效數(shù)字。

針對(duì)enum,bool,boolean,指針等類型這里不再討論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容