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