# C 資料型態 ###### tags: `C` * C 資料型態,區分為 int, flat, char 根据 GCC版本的不同有不同的資料範圍 ## C99 * 增加了新關鍵字restrict, inline, _Complex, _Imaginary, _Bool * 支持long long, long double _Complex, float _Complex 等類型 * 支持不定長的數組,即數組長度可以在運行時決定,比如利用變量作為數組長度。聲明時使用 int a[var] 的形式。不過考慮到效率和實現,不定長數組不能用在全局,或 struct 與 union 。 * 變量聲明不必放在語句塊的開頭,for語句提倡寫成for(int i=0;i<100;++i) 的形式,即i只在for語句塊內部有效。 * 支持 16 進位的浮點數的描述。 * printf, scanf 的格式化串增加了對 long long int 類型的支持。 * 浮點數的內部數據描述支持了新標準,可以使用 #pragma 編譯器指令指定。 * 除了已有的 __LINE__和__FILE__ 以外,增加了__func__得到當前的函數名。 * 允許在 struct 的最後定義的數組不指定其長度,寫做 [](flexible array member)。 * const const int i 將被當作 const int i 處理。 * 增加和修改了一些標準頭文件,比如定義 bool 的 <stdbool.h> ,定義一些標準長度的int的<inttypes.h>,定義複數的<complex.h>,定義寬字符的<wctype.h>,類似於泛型的數學函數<tgmath.h>,浮點數相關的<fenv.h>。在<stdarg.h>增加了va_copy用於複製...的參數。<time.h>里增加了struct tmx,對struct tm做了擴展。 ## <span class="red">基本型態</span> <style> .red { color: red; } </style> ### 整數 * 可以區分為 short、int、long 與 long long(C99),配置的記憶體長度在不同編譯器上各不相同,可容納的大小各不相同 * Linux 64 位元 Ubuntu 16.04 中的 gcc 編譯器下,int 與 long 為 8 位元組 * Windows 10 使用 MinGW-w64,GNU 編譯器版本是 8.1.0 型態的話,int 與 long 為 4 位元組,長度越長,表示可表示的整數值範圍越大。 ### 浮點數 * 用來表示小數值,可以區分為 float、double 與 long double,越後面的型態使用的記憶體空間越大,精度也就越高 ### 字元 * char 的 sizeof(char) 結果要是 1,基本上用來儲存字元資料,但沒有規定什麼是字元資料,也可用來儲存較小範圍的整數。 * 字元相關的型態,其實還有來自 C89 的 wchar_t,以及 C11 標準規範的 char16_t、char32_t(定義在 unchar.h 標頭檔)。 ### 無符號 and 有符號 * 有符號: int8, int16, int32, int64 * 無符號: uint8, uint16, uint32, uint64 * 在 C11 標準中,建議包括 stdint.h 程式庫,使用 int8_t、int16_t、int32_t、int64_t uint8_t、uint16_t、uint32_t、uint64_t 等作為整數型態的宣告,以避免平台相依性的問題。 * 通常一般作業系統都是1byte=8bits,因此int8和uint8都是佔1byte大小,差別是在於int8可接受負整數,並用最左邊的位元來代表正負號,所以說int8的最大值會比uint8小(因為少一個bit) ## 型態 ```= 型態/編譯器 16位編譯器 32位編譯器 64位編譯器 void 0 0 0 char 1 1 1 char * 2 4 8 short int 2 2 2 int 2 4 4 float 4 4 4 double 8 8 8 long 4 4 8 long double 8 12 16 long long 8 8 8 ``` ```= 型態/編譯器 32位編譯器 64位編譯器 uint8_t 1 1 uint16_t 2 2 uint32_t 4 4 uint64_t 8 8 ``` ```= 型態/編譯器 32位編譯器 64位編譯器 unsigned int 4 4 unsigned int8_t 1 1 unsigned int16_t 2 2 unsigned int32_t 4 4 unsigned int64_t 8 8 unsigned char 1 1 unsigned short 2 2 unsigned long 4 4 unsigned long long 8 8 ``` ## 參考資料 * [資料型態](https://openhome.cc/Gossip/CGossip/Datatype.html) * [資料類型範圍](https://docs.microsoft.com/zh-tw/cpp/cpp/data-type-ranges?view=msvc-170)