Can you summarize the following document?
        
  "注意:以下是典型的資料位長和範圍。編譯器可能使用不同的資料位長和範圍。請參考具體的參考手冊。"  在標準標頭檔案limits.h 和 float.h中說明了基礎資料的長度。float,double和long double的範圍就是在IEEE 754標準中提及的典型資料。另外,C99新增了新的複數型別,C11新增了原子型別,它們不在本條目討論範圍內。關於這些型別的具體含義和部分細節,參見資料型別,最後一列寫出了這些型別在硬體層面的型別(x86&x86_64實現) 注:粗體為C99所新增的型別。

  在C語言中,複合資料型別可分為三類:結構、聯合和列舉。在現代C語言中,聯合和列舉的使用頻率已逐漸減少。

  結構(structure variable)允許構造由多個基礎資料型別組合而成的複雜結構。結構為物件導向程式設計的藍本。以下示例通過結構和結構體裡的指標實現了二叉樹結構:  typedef struct Bintree { } bintree; // 自定義 bintree 型別  為結構定義變數時通常會用到動態記憶體分配:  bintree *tree; tree = mktree(); // 分配到 tree 指標 tree->data = 1; tree->lchild = mktree();  由於C語言不具備自動垃圾收集(Garbage Collection)功能,使用完畢後呼叫codice_1來釋放之前通過codice_2分配的記憶體。詳見這裡。 在C99標準中,還新增了名為伸縮型陣列成員的特性,關於此特性的內容超出了該條目的介紹範圍,若需瞭解更多資訊可參見文件或其它材料。

  聯合(union)與結構相類似,但不同的是,聯合在某一特定時刻只有最後被使用的成員的值是確定的,因此一個聯合只使用所有成員中所佔空間最大的成員所使用的記憶體。然而,一些編譯器可以通過編譯引數或#pragma的方式強制聯合使用與所有成員所佔儲存空間的和相等的儲存空間,在這種情況下,除最後被使用的成員外,其餘成員的值是未定義的。以下給出了聯合的一個宣告:  union foo{  foo.bar = 8; foo.foobar = 3.14;  在這個例子中,假設使用32位平臺編譯,一個double變數佔8位元組,一個int變數佔2位元組(由上表得),則該聯合所佔大小即為double型別的大小——8位元組。在這段程式執行完畢後,foo.bar的值是未定義的,而foo.foobar的值為3.14。

  列舉(enumerated type)用來宣告一組整數常量。預設情況下,列舉宣告格式為enum "type" {value1,value2...,valuen};此時value1,value2分別為0,1,直到n-1。事實上,列舉型別在C語言實現中是以int型別儲存的。以下是列舉的一個宣告:  enum a { b, c, d };  在此之後,便可以以如下方式使用:  enum a foo; foo = b; if(foo!= c) //等同於if(foo!= 1)  而此時的b,c,d分別為0,1,2。 另外,也可以手動為列舉列表中的常量賦值。下面是一個例子:  enum colour {red = 100,blue = 700,yellow = 200};  則此時red,blue,yellow的值分別為100,700,200.  需要注意的是,列舉在C和C++中所表現的行為有一些細微的差異。參見C和C++的相容性。
在C語言中,資料型別可以分為兩類:基礎資料型別和複合資料型別。