---
# System prepended metadata

title: C 資料型態
tags: [C]

---

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