在計算機編程語言的學習中,很多初學者甚至好幾年的老手對基本類型的應用和理解都存在著一些模糊的地方撮弧,今天我就拿C語言和Java語言中的基本類型來舉例绞惦,深度解剖它們的設計原理基协。
一、計算機存儲處理信息的單位
1bit(位): 表示一個二進制數(shù)碼0或1剑按,是計算機存儲處理信息的最基本的單位(存儲單元)疾就。這里的bit和電信號之間通過高(1),低(0)電平進行對應處理艺蝴,讓硬件做出相應的操作虐译。
byte(字節(jié)):一個字節(jié)由8個位組成 。它表示作為一個完整處理單位的8個二進制數(shù)碼∥馀浚現(xiàn)目前計算機上多使用《美國國家信息交換標準代碼》——ASCII編碼(由美國國家標準委員會制定)漆诽,如:字符“A”的二進制編碼是“0100 0001”即41H或65D “#”的二進制編碼是“0010 0011”即23H或35D侮攀,一個漢字是兩個字節(jié),一個英文字母是一個字節(jié)厢拭,標點符號也是一個字節(jié)兰英。
注意:因為byte是一個完整處理單位(這個一個規(guī)定設計),所以編程語言中數(shù)據(jù)類型的長度基本單位為字節(jié)供鸠。字(Word):16個位為一個字(即兩個字節(jié)是一個字) 畦贸,它代表計算機處理指令或數(shù)據(jù)的二進制數(shù)位數(shù),是計算機進行數(shù)據(jù)存儲和數(shù)據(jù)處理的運算單位楞捂。通常稱16位是一個字薄坏,32位是一個雙字,64位是兩個雙字寨闹。
注意:
1胶坠、bit的設計是根據(jù)二進制0,1設計,電信號和數(shù)字通信間通過高低電平進行通信繁堡,而高低匹配二進制的1,0沈善。
2、一個存儲單元(一個byte)都有一個地址椭蹄,是一個整數(shù)編碼闻牡,可以表示為二進制整數(shù)。編程語言中的變量和主存儲器的存儲單元相對應绳矩。變量的名字對應著存儲單元的地址罩润,變量內(nèi)容對應著單元所存儲的數(shù)據(jù)。(C語言中的指針翼馆,地址割以,值)
3、一個byte的完整處理單元(存儲/讀取/解析)写妥,是CPU與存儲器間的地址總線和數(shù)據(jù)總線寬度設計的基本單元拳球,個別芯片會出現(xiàn)地址總線20位,大部分都是一個byte的倍數(shù)珍特,因為馮諾依曼結(jié)構(gòu)是順序執(zhí)行指令祝峻。
二、計算機中的字長扎筒,尋址空間莱找,字符的概念
字長:是CPU的主要技術(shù)指標之一,指的是CPU一次能并行處理的二進制的位數(shù)嗜桌,字長是8的整倍數(shù)奥溺,通常的PC機的字長為16位,32位骨宠,64位浮定。一臺16位字長的PC機可以直接處理216(65536)之內(nèi)的數(shù)字相满,對于超過此范圍的數(shù)字需要分解的方法來處理。32位機比16位機優(yōu)越的原因之一就在于它在一次操作中能處理的數(shù)字大桦卒,32位機字長的PC機能直接處理的數(shù)字為232(40億)立美,能處理的數(shù)字越大,則操作的次數(shù)就越少方灾,從而系統(tǒng)的效率就越高建蹄。
尋址空間:要看處理器的地址總線的位數(shù),而不是它的字長裕偿。如Intel P4處理器字長為32位洞慎,地址總線也是32位。8086的數(shù)據(jù)總線為16為嘿棘,地址總線為20位(則可尋址的內(nèi)存空間為220=1MB)劲腿。新興的64位處理器的數(shù)據(jù)總線為64位,地址總線大部分是32位蔫巩。再看地址總線與尋址范圍的關(guān)系谆棱,存儲單元是以Byte為單位快压,N根地址總線能夠訪問2N個存儲單元圆仔,于是有32位地址總線可訪問2^32個存儲單元,即4GB蔫劣。
字符:是可使用多種不同字符方案或代碼頁來表示的抽象實體坪郭。例如,Unicode UTF-16 編碼將字符表示為 16 位整數(shù)序列脉幢,而 Unicode UTF-8 編碼則將相同的字符表示為 8 位字節(jié)序列歪沃。公共語言運行庫使用 Unicode UTF-16(Unicode 轉(zhuǎn)換格式,16 位編碼形式)表示字符嫌松。
注意:
1沪曙、字長取決于它的通用寄存器、內(nèi)存儲器萎羔、ALU的位數(shù)和數(shù)據(jù)總線的寬度液走。字長=2^數(shù)據(jù)總線位數(shù)
2、尋址空間就是CPU一次性能夠?qū)ふ叶啻髢?nèi)存贾陷,然后再從這些內(nèi)存地址中找到匹配的地址缘眶。尋址空間=2^地址總線
3、字符是字符方案的實體髓废,字符方案(字符編碼)是人類語言和計算機二進制編碼間的協(xié)議方案巷懈。
三、C與Java基本數(shù)據(jù)類型設計
編程語言如果需要做和人類直接溝通慌洪,那么需要對我們認知的數(shù)字和字符進行定義顶燕,所以編程語言的基本數(shù)據(jù)類型也分為字符和數(shù)字
注意:
1凑保、不同編譯系統(tǒng),整數(shù)的存儲長度不同涌攻。對于16位的編譯系統(tǒng)愉适,int為2字節(jié);而對于32位的編譯系統(tǒng)癣漆,int為4字節(jié)维咸。可以用sizeof運算符測試惠爽。
2.癌蓖、而且在C/C++中可以通過類型修飾符signed和unsigned用于修飾字符型和整型。
3.婚肆、對于C/C++語言long是32bit是歷史的包袱, long long是8字節(jié)
四租副、對于float和double的取值范圍和精度
首先我們了解下它們的內(nèi)存結(jié)構(gòu),如下圖所示:
- 1较性、范圍
float和double的范圍是由指數(shù)的位數(shù)來決定的
float取值范圍 2^(-2^7~+2^7-1)
double取值范圍 2^(-2^10~+2^10-1)
- 2用僧、精度
float和double的精度是由尾數(shù)的位數(shù)來決定的。浮點數(shù)在內(nèi)存中是按科學計數(shù)法來存儲的赞咙,其整數(shù)部分始終是一個隱含著的“1”责循,由于它是不變的,故不能對精度造成影響攀操。
float的精度2^23=8388608 7位有效數(shù)字
double的精度2^52=4503599627370496 15位有效數(shù)字
注意
1院仿、因為浮點數(shù)精度左邊還有一個隱含著的1所以 float 7-8位有效數(shù)字 double 15-16位有效數(shù)字。
針對enum速和,bool歹垫,boolean,指針等類型這里不再討論