# 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)