類型之間的轉換
-
C語言中的資料類型可以進行轉換
○ 強制類型轉換
○ 隐式類型轉換
void main_1()
{
long l = 800;
int i = (int)l; // 強制類型轉換
}
void mian_2()
{
short s = 800;
int i = s; // 隐式類型轉換
// no error, no warning
}
強制類型轉換
- 強制類型轉換的文法
○ (Type)var_name;
○ (Type)value;
- 強制類型轉換的結果
○ 目标類型能夠容納目标值:結果不變
○ 目标類型不能容納目标值:結果将産生中斷
注意:不是所有的強制類型轉換都能成功,當不能進行強制類型轉換時,編譯器将産生錯誤資訊。
執行個體分析:強制類型轉換
#include <stdio.h>
struct TS
{
int i;
int j;
};
struct TS ts;
int main()
{
short s = 0x1122;
char c = (char)s; // 0x22
int i = (int)s; // 0x00001122
int j = (int)3.1415; // 3
unsigned int p = (unsigned int)&ts;
long l = (long)ts; // error
ts = (struct TS)l; // error
printf("s = %x\n", s);
printf("c = %x\n", c);
printf("i = %x\n", i);
printf("j = %x\n", j);
printf("p = %x\n", p);
printf("&ts = %p\n", &ts);
return 0;
}
輸出:
s = 1122
c = 22
i = 1122
j = 3
p = 804a01c
&ts = 0x804a01c
注意:unsigned int p = (unsigned int)&ts; 在64位機時,将發生資料截斷。64位機器指針占8位元組!表達式中的
隐式類型轉換
- 編譯器主動進行的類型轉換
char c = 0; // 變量 c 占用1個位元組
short s = c; // c 到 s 隐式類型轉換
int i = s; // s 到 i 隐式類型轉換
long = i; // i 到 l 隐式類型轉換
注意:
○ 低類型到高類型的隐式轉換是安全的,不會産生截斷;
○ 高類型到低類型的隐式轉換是不安全的,導緻不正确的結果。
表達式中的隐式類型轉換
- 隐式類型轉換的發生點
- 算術運算中,低類型轉化為高類型
- 指派表達式中,表達式的值轉換為左邊變量的類型
- 函數調用時,實參轉換為形參的類型
- 函數傳回時,return 表達式轉換為傳回值類型
執行個體分析:隐式類型轉換
#include <stdio.h>
int main()
{
char c = 'a';
int i = c; // safe
unsigned int j = 0x11223344;
short s = j; // unsafe
printf("c = %c\n", c);
printf("i = %d\n", i);
printf("j = %x\n", j);
printf("s = %x\n", s);
printf("sizeof(c + s) = %d\n", sizeof(c + s));
return 0;
}
輸出:
c = a
i = 97
j = 11223344
s = 3344
sizeof(c + s) = 4
sizeof(c + d) = 8
小結
強制類型轉換由程式員負責完成
○轉換可能産生截斷
○轉換不區分類型的高低
○轉換不成功時,編譯器會給出錯誤資訊
隐式類型轉換由編譯器自動完成
○低類型向高類型的轉換是安全的
○高類型向低類型的轉換是不安全的
注意:标準C編譯器的類型檢查是比較寬松的,是以隐式類型轉換可能帶來意外的錯誤。