# 類型轉換問題
### 類型轉換問題
- 類型轉換分為:隱式數據類型轉換和顯示數據類型轉換
- 自動轉換(隱式轉換):
- 自動轉換發生在不同數據類型的量混合運算時,由編譯系統自動完成。
- 自動轉換遵循以下規則
+ **相同數據類型的值才能進行運算(比如加法運算),而且運算結果依然是同一種數據類型。系統會自動對占用內存較少的類型做一個“自動類型提升”的操作**
+ 若參與運算量的類型不同,則先轉換成同一類型,然后進行運算
+ 轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉 成long型后再進行運算
+ 所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成 double 型,再作運算
+ char型和short型參與運算時,必須先轉換成int型
+ 在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四舍五入向前舍入
```
double
↑
long
↑
unsigned
↑
int
↑
char|short
```
例如:
```
int i = 1;
i = i + 8.808
printf("%d", i); // 輸出結果: 9
```
> 按照隱式處理方式,在處理`i = i + 8.808`時
> 首先i轉換為double型,然后進行相加,結果為double 型,再將double型轉換為整型賦給i
- 強制類型轉換(顯示轉換)
- 強制類型轉換是通過類型轉換運算來實現的
+ 其一般形式為:(類型說明符) (表達式)
```
(float) a; /* 把a轉換為實型 */
(int)(x+y); /* 把x+y的結果轉換為整型 */
```
```
int i = 1;
i = i + (int)8.808
printf("%d", i); // 輸出結果: 9
```
> 這時直接將8.808轉換成整型,然后與i相加,再把結果賦給i。
> 其實: 這樣可把二次轉換簡化為一次轉換。
```
int i = 1;
i = (int)(i + 8.808)
printf("%d", i);
// 或者讓系統隱式轉換
int i = 1;
i = i + 8.808
printf("%d", i);
```
- 強制類型轉換注意點
+ 將大范圍的數據賦值給小范圍變量時,系統會自動做一個強制類型轉換的操作,這樣容易丟失精度
+ 類型說明符和表達式都必須加括號(單個變量可以不加括號),如把(int)(x+y)寫成(int)x+y 則成了把x轉換成int型之后再與y相加了
+ 無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變量的數據長度進行的臨時性 轉換,而不改變數據說明時對該變量定義的類型
```
float floatValue = 10.1f;
int sum = 4 + (int)floatValue ;
printf("sum = %d", sum);// 輸出14
// floatValue本身的值并沒有改變
printf("floatValue = %f", floatValue); // 輸出10.100000
```