< 筆記一、數(shù)據(jù)類(lèi)型 >
現(xiàn)在業(yè)界普遍認(rèn)可以下等式
程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法 + 文檔
這第一篇筆記就只對(duì)以上提到的數(shù)據(jù)結(jié)構(gòu)結(jié)合本人的理解展開(kāi)做些總結(jié)。
類(lèi)型
程序的輸入輸出的實(shí)體就是數(shù)據(jù)信息,而對(duì)這些數(shù)據(jù)信息給以歸類(lèi)和組織,我們就稱(chēng)為數(shù)據(jù)結(jié)構(gòu)。因此數(shù)據(jù)結(jié)構(gòu)就是對(duì)數(shù)據(jù)的組織形式,也可以說(shuō)是對(duì)內(nèi)存的編碼規(guī)則。由于基于底層的數(shù)據(jù)都是二進(jìn)制的 0 、 1 序列,所以人們通常將 8 個(gè)連續(xù)的 0 、 1 序列看作一個(gè)獨(dú)立的結(jié)構(gòu)——字節(jié)( Byte ),字節(jié)中的每一個(gè)二進(jìn)制序列就是一個(gè)位( bit )。但是這種組織形式太過(guò)籠統(tǒng),為此 C 語(yǔ)言提供了四種基本類(lèi)型(整型、浮點(diǎn)型、字符型、枚舉類(lèi)型)、三種構(gòu)造類(lèi)型(數(shù)組、結(jié)構(gòu)體、聯(lián)合體)、指針類(lèi)型和空類(lèi)型。 C++ 語(yǔ)言在以上 9 種類(lèi)型基礎(chǔ)上又增加了一種基本類(lèi)型—— bool 型和一種構(gòu)造類(lèi)型——類(lèi)類(lèi)型( class )。
編碼規(guī)則
雖然 C 數(shù)據(jù)類(lèi)型有 9 種 C++ 有 11 種,但是按編碼規(guī)則所有數(shù)據(jù)類(lèi)型卻只采用了兩種編碼方式,即整型和浮點(diǎn)型。以下對(duì)各類(lèi)型結(jié)合編碼規(guī)則稍作展開(kāi):
整型數(shù)據(jù)根據(jù)有無(wú)符號(hào)位可以區(qū)分為 signed 和 unsigned 兩種類(lèi)型,對(duì)于 signed 的編碼方式,最高位用做符號(hào)位用,其它位用作數(shù)據(jù)位,而 unsigned 類(lèi)型所有位全都用來(lái)做數(shù)據(jù)位。數(shù)據(jù)位采用補(bǔ)碼形式編碼,正數(shù)的補(bǔ)碼以原碼給出,而負(fù)數(shù)的補(bǔ)碼為原碼的反碼加 1 給出,因此 11111111 表示無(wú)符號(hào)整型時(shí)為 255 ,表示有符號(hào)整型時(shí)為 -1 。 ANSIC 整型類(lèi)型給出了三種不同字節(jié)長(zhǎng)度類(lèi)型符為 short 、 int 、 long ,但 ANSIC 并沒(méi)有規(guī)定每一種類(lèi)型的具體長(zhǎng)度,可以視不同的編譯器而變化,但要求 short 不長(zhǎng)于 int 不長(zhǎng)于 long 。通常 32 位用 VC 編譯器編譯時(shí) short 為 2 字節(jié)、 int 為 4 字節(jié)、 long 也為 4 字節(jié)。
浮點(diǎn)型數(shù)據(jù)編碼規(guī)則不區(qū)分有無(wú)符號(hào),一致都采用 1 符號(hào)位 n 數(shù)據(jù)位 m 指數(shù)位來(lái)表示,其中 n 又被稱(chēng)為浮點(diǎn)類(lèi)型的有效位數(shù), n 越大則精度越高,同時(shí) m 越大表示的數(shù)據(jù)越大。 ANSIC 給出了不同字節(jié)長(zhǎng)度的浮點(diǎn)數(shù)類(lèi)型 float 、 double ,同樣沒(méi)有規(guī)定每一種類(lèi)型的具體長(zhǎng)度,但要求 float 不長(zhǎng)于 double 。 32 位 VC 編譯下 float 為 4 字節(jié), double 為 8 字節(jié)長(zhǎng)度。
字符型,即按 ASCII 碼表排序,以單個(gè)字節(jié)長(zhǎng)度采用整型編碼方式編碼,也要區(qū)分 signed 和 unsigned 兩種類(lèi)型。例 char A = 255 和 unsiged char B = 255, 都是表示同一個(gè)字符,但是 A 實(shí)際值為 -1 , B 的值才是 255 。
枚舉類(lèi)型,采用 enum 類(lèi)型符,可以說(shuō)是一種自定義類(lèi)型,為了說(shuō)明 enum 的有用性,我以代碼方式總結(jié):
const int sun = 0;
const int mon = 1;
const int tue = 2;
const int wen = 3;
const int thu = 4;
const int fri = 5;
const int sat = 6;
int today = sun;
以上代碼從程序可讀性來(lái)說(shuō)顯然沒(méi)有如下采用 enum 方式來(lái)的好,至于從代碼執(zhí)行效果來(lái)說(shuō)是否有優(yōu)越性我還不是很清楚,有達(dá)人知道還望指點(diǎn)。
typedef enum WEEKDAY
{
sun,
mon,
tue,
tue,
wen,
thu,
fri,
sat
}weekDay;
weekDay today = sun;
枚舉類(lèi)型實(shí)際在內(nèi)存中是以 int 類(lèi)型值編碼的,當(dāng)?shù)谝粋€(gè)枚舉類(lèi)型常量沒(méi)有賦初值時(shí),默認(rèn)為 0 開(kāi)始,以后依次遞增 1 。
以上對(duì)四種基本類(lèi)型進(jìn)行了展開(kāi),而三種構(gòu)造類(lèi)型數(shù)組、結(jié)構(gòu)體、聯(lián)合體則是有四種基本類(lèi)型根據(jù)需求自由組合而成。
數(shù)組類(lèi)型,其實(shí)就是根據(jù)需要用戶(hù)自定義以同一種類(lèi)型聲明一個(gè)數(shù)組長(zhǎng)度的一組變量,數(shù)組類(lèi)型本身沒(méi)有類(lèi)型符。在內(nèi)存中以同一編碼規(guī)則連續(xù)編碼一塊數(shù)組長(zhǎng)度的空間。
結(jié)構(gòu)類(lèi)型,則是根據(jù)需求用戶(hù)采用不同種類(lèi)型的數(shù)據(jù)量構(gòu)成的一個(gè)新的類(lèi)型,它以 struct 類(lèi)型符定義,在內(nèi)存中以事先安排的順序和基本類(lèi)型編碼規(guī)則編碼。
聯(lián)合體類(lèi)型,由于結(jié)構(gòu)類(lèi)型中的每一中基本類(lèi)型都是分配一塊內(nèi)存,但是有一種需求是一塊內(nèi)存可以以不同的類(lèi)型來(lái)拆分,這種需求在通信中相當(dāng)常見(jiàn),為此引進(jìn)了聯(lián)合體類(lèi)型。見(jiàn)下面列子
typedef union CODON
{
DWORD m_dwCodon;
char m_chCodon[4];
}Codon;
以上定義了常用的四個(gè)長(zhǎng)度的碼字,每一個(gè)碼字都是一個(gè)字符,但是為了程序中比較運(yùn)算方便我們可以用一個(gè) DWORD (四個(gè)字節(jié)的整數(shù)類(lèi)型)值來(lái)進(jìn)行整數(shù)比較。
指針類(lèi)型,指針類(lèi)型本身是一個(gè) 32 位即 4 個(gè)字節(jié)來(lái)描述的正整數(shù)數(shù)據(jù),表示的是變量的內(nèi)存地址,所以不管指針是定義成何種類(lèi)型用 sizeof 取得的始終是 4 字節(jié)長(zhǎng)度,但是指針做增一運(yùn)算時(shí)就跟具體的數(shù)據(jù)類(lèi)型相關(guān)了。如 char *p ; p++ 就是加 1 ,而 int *p ; p++ 就是加 4 了。
空類(lèi)型,即 void 類(lèi)型,在函數(shù)返回值和形參中用的比較多,并且與指針類(lèi)型常結(jié)合在一起用,該類(lèi)型弱化了編碼規(guī)則,但是不能用這種類(lèi)型來(lái)聲明和定義變量。
C++ 新增的兩種類(lèi)型, bool 型其實(shí)也是一個(gè)字節(jié)類(lèi)型的,按照整型數(shù)據(jù)來(lái)編碼,其值 true 為 1 , false 為 0 。至于 class 類(lèi)型,在內(nèi)存中編碼規(guī)則等同與 struct 。以后將做更多的討論。
至此,將 C 和 C++ 內(nèi)的數(shù)據(jù)類(lèi)型做了一個(gè)小小闡述,下一節(jié)將小結(jié)變量。