## 基本數據類型
### 什么是數據?
生活中時時刻刻都在跟數據打交道,比如體重數據、血壓數據、股價數據等。在我們使用計算機的過程中,會接觸到各種各樣的數據,有文檔數據、圖片數據、視頻數據,還有聊QQ時產生的文字數據、用迅雷下載的文件數據等。
C語言中,數據類型可分為:**基本數據類型**,**構造數據類型**,**指針類型**,**空類型四大類**。如圖所示:

### 整型、實型和字符型
基本數據類型中最簡單也是最常用的整型、實型與字符型。
| 數據類型 | 說明 | 字節 | 應用 | 示例 |
| --- | --- | --- | --- | --- |
| `char` | 字符型 | 1 | 用于存儲單個字符 | `char sex = 'M'` |
| `int` | 整型 | 2 | 用于存儲整型 | `int height = 18;` |
| `float` | 單精度浮點數 | 4 | 用于存儲小數 | `float price = 11.1;` |
| `double` | 雙精度浮點型 | 8 | 用于存儲位數更多的小數 | `double pi = 3.1415926;` |
#### 整型
整型數據是指不帶小數的數字。生活中有很多信息適合使用整型數據來表示,比如:人的年齡、班級的人數、書的總頁數等等。因此整型的類型比較多:
| 數據類型 | 說明 | 字節 | 取值范圍 |
| --- | --- | --- | --- |
| `int` | 整型 | 2 | `(-23768~32767) -2^15~2^15-1` |
| `short int` | 短整型(int 可省略) | 2 | `(-23768~32767) -2^15~2^15-1` |
| `long int` | 長整形(int 可省略) | 4 | `(-2147483648~2147483647) -2^31~2^31-1` |
| `unsigned int` | 無符號整形 | 2 | `(0~65535) 0~2^16-1` |
| `unsigned short int` | 無符號短整形(int 可省略) | 2 | `(0~65535) 0~2^16-1` |
| `unsigned long int` | 無符號長整形(int 可省略) | 4 | `(0~4294967295) 0~2^32-1` |
> `int`、`short int`、`long int`是根據編譯環境的不同,所取范圍不同。而其中`short int`和`long int`至少是表中所寫范圍,但是`int`在表中是以16位編譯環境寫的取值范圍。
> 另外 c語言`int`的取值范圍在于他占用的字節數 ,不同的編譯器,規定是不一樣。ANSI標準定義`int`是占2個字節,TC是按ANSI標準的,它的`int`是占2個字節的。但是在VC里,一個`int`是占4個字節的。
#### 浮點數
浮點數據是指帶小數的數字。生活中有很多信息適合使用浮點型數據來表示,比如:人的體重(單位:公斤)、商品價格、圓周率等等。因為精度的不同又分為3種:
| 數據類型 | 說明 | 字節 | 取值范圍 |
| --- | --- | --- | --- |
| `float` | 單精度型 | 4 | -3.4*10^-38~3.4*10^38 |
| `double` | 雙精度型 | 8 | -1.7*10-308~1.7*10^308 |
| `long double` | 長雙精度型 | 16 | -1.2*10^-4932~1.7*10^4932 |
>注:C語言中不存在字符串變量,字符串只能存在字符數組中。
## 自動類型轉換
數據類型存在自動轉換的情況,比如:
```
char a = 'a';
int x;
double d;
x = a; // 字符串類型可以自動轉換成整形
d = x; // 整形可以自動轉成為浮點型
```
自動轉換發生在不同數據類型運算時,在編譯的時候自動完成。自動轉換遵循的規則就好比小盒子可以放進大盒子里面一樣,下圖表示了類型自動轉換的規則。

char類型數據轉換為int類型數據遵循ASCII碼中的對應值,ASCII碼請查看WIKI。
> 注:字節小的可以向字節大的自動轉換,但字節大的不能向字節小的自動轉換。
## 強制類型轉換
強制類型轉換是通過定義類型轉換運算來實現的。其一般形式為:
?`(數據類型) (表達式)?`
其作用是把表達式的運算結果強制轉換成類型說明符所表示的類型,例如:
```
double tempOne = 6.777;
int tempTwo = (int)tempOne; // 強制轉換為int類型
printf("%f\n", tempOne); // 6.777000
printf("%d\n", tempTwo); // 6
```
在使用強制轉換時應注意以下問題:
1. 數據類型和表達式都必須加括號,如把`(int)(x/2+y)`寫成`(int)x/2+y`則成了把x轉換成int型之后再除2再與y相加了。
2. 轉換后不會改變原數據的類型及變量值,只在本次運算中臨時性轉換。
3. 強制轉換后的運算結果不遵循四舍五入原則。