在計算機編程語言的學習中,很多初學者甚至好幾年的老手對基本類型的應用和理解都存在著一些模糊的地方,今天我就拿C語言和Java語言中的基本類型來舉例,深度解剖它們的設計原理。
一、計算機存儲處理信息的單位
1bit(位): 表示一個二進制數碼0或1,是計算機存儲處理信息的最基本的單位(存儲單元)。這里的bit和電信號之間通過高(1),低(0)電平進行對應處理,讓硬件做出相應的操作。
byte(字節):一個字節由8個位組成 。它表示作為一個完整處理單位的8個二進制數碼。現目前計算機上多使用《美國國家信息交換標準代碼》——ASCII編碼(由美國國家標準委員會制定),如:字符“A”的二進制編碼是“0100 0001”即41H或65D “#”的二進制編碼是“0010 0011”即23H或35D,一個漢字是兩個字節,一個英文字母是一個字節,標點符號也是一個字節。
注意:因為byte是一個完整處理單位(這個一個規定設計),所以編程語言中數據類型的長度基本單位為字節。字(Word):16個位為一個字(即兩個字節是一個字) ,它代表計算機處理指令或數據的二進制數位數,是計算機進行數據存儲和數據處理的運算單位。通常稱16位是一個字,32位是一個雙字,64位是兩個雙字。
注意:
1、bit的設計是根據二進制0,1設計,電信號和數字通信間通過高低電平進行通信,而高低匹配二進制的1,0。
2、一個存儲單元(一個byte)都有一個地址,是一個整數編碼,可以表示為二進制整數。編程語言中的變量和主存儲器的存儲單元相對應。變量的名字對應著存儲單元的地址,變量內容對應著單元所存儲的數據。(C語言中的指針,地址,值)
3、一個byte的完整處理單元(存儲/讀取/解析),是CPU與存儲器間的地址總線和數據總線寬度設計的基本單元,個別芯片會出現地址總線20位,大部分都是一個byte的倍數,因為馮諾依曼結構是順序執行指令。
二、計算機中的字長,尋址空間,字符的概念
字長:是CPU的主要技術指標之一,指的是CPU一次能并行處理的二進制的位數,字長是8的整倍數,通常的PC機的字長為16位,32位,64位。一臺16位字長的PC機可以直接處理216(65536)之內的數字,對于超過此范圍的數字需要分解的方法來處理。32位機比16位機優越的原因之一就在于它在一次操作中能處理的數字大,32位機字長的PC機能直接處理的數字為232(40億),能處理的數字越大,則操作的次數就越少,從而系統的效率就越高。
尋址空間:要看處理器的地址總線的位數,而不是它的字長。如Intel P4處理器字長為32位,地址總線也是32位。8086的數據總線為16為,地址總線為20位(則可尋址的內存空間為220=1MB)。新興的64位處理器的數據總線為64位,地址總線大部分是32位。再看地址總線與尋址范圍的關系,存儲單元是以Byte為單位,N根地址總線能夠訪問2N個存儲單元,于是有32位地址總線可訪問2^32個存儲單元,即4GB。
字符:是可使用多種不同字符方案或代碼頁來表示的抽象實體。例如,Unicode UTF-16 編碼將字符表示為 16 位整數序列,而 Unicode UTF-8 編碼則將相同的字符表示為 8 位字節序列。公共語言運行庫使用 Unicode UTF-16(Unicode 轉換格式,16 位編碼形式)表示字符。
注意:
1、字長取決于它的通用寄存器、內存儲器、ALU的位數和數據總線的寬度。字長=2^數據總線位數
2、尋址空間就是CPU一次性能夠尋找多大內存,然后再從這些內存地址中找到匹配的地址。尋址空間=2^地址總線
3、字符是字符方案的實體,字符方案(字符編碼)是人類語言和計算機二進制編碼間的協議方案。
三、C與Java基本數據類型設計
編程語言如果需要做和人類直接溝通,那么需要對我們認知的數字和字符進行定義,所以編程語言的基本數據類型也分為字符和數字
注意:
1、不同編譯系統,整數的存儲長度不同。對于16位的編譯系統,int為2字節;而對于32位的編譯系統,int為4字節。可以用sizeof運算符測試。
2.、而且在C/C++中可以通過類型修飾符signed和unsigned用于修飾字符型和整型。
3.、對于C/C++語言long是32bit是歷史的包袱, long long是8字節
四、對于float和double的取值范圍和精度
首先我們了解下它們的內存結構,如下圖所示:
- 1、范圍
float和double的范圍是由指數的位數來決定的
float取值范圍 2^(-2^7~+2^7-1)
double取值范圍 2^(-2^10~+2^10-1)
- 2、精度
float和double的精度是由尾數的位數來決定的。浮點數在內存中是按科學計數法來存儲的,其整數部分始終是一個隱含著的“1”,由于它是不變的,故不能對精度造成影響。
float的精度2^23=8388608 7位有效數字
double的精度2^52=4503599627370496 15位有效數字
注意
1、因為浮點數精度左邊還有一個隱含著的1所以 float 7-8位有效數字 double 15-16位有效數字。
針對enum,bool,boolean,指針等類型這里不再討論