C语言中有很多数据类型,这些类型之间可以相互转换吗?
C语言中的数据类型可以进行转换
1、强制类型转换
2、隐式类型转换
强制类型转换:
示例如下:
1 #include <stdio.h> 2 3 struct TS 4 { 5 int i; 6 int j; 7 }; 8 9 struct TS ts; 10 11 int main() 12 { 13 short s = 0x1122; 14 15 char c = (char)s; // 0x22 16 17 int i = (int)s; // 0x00001122 18 19 int j = (int)3.1415; // 3 20 21 unsigned int p = (unsigned int)&ts; 22 23 long l = (long)ts; // error 24 25 ts = (struct TS)l; // error 26 27 printf("s = %x\n", s); 28 printf("c = %x\n", c); 29 printf("i = %x\n", i); 30 printf("j = %x\n", j); 31 printf("p = %x\n", p); 32 printf("&ts = %p\n", &ts); 33 34 return 0; 35 }
15行的转换产生截断留下0x22,19行的强制类型转换直接将小数部分扔掉,留下整数部分。21行的转换在32位机器上不会产生截断,在64位机器上会产生截断。
23行会产生错误,在C语言中,自定义类型是不能转换为基本类型的。基本类型也不能转换为自定义类型,所以25行也是错误的。
注释掉错误行,运行结果如下:
隐式类型转换:
隐式类型转换的发生点:
隐式类型转换实例分析:
1 #include <stdio.h> 2 3 int main() 4 { 5 char c = 'a'; 6 7 int i = c; // safe 8 9 unsigned int j = 0x11223344; 10 11 short s = j; // unsafe 12 13 printf("c = %c\n", c); 14 printf("i = %d\n", i); 15 printf("j = %x\n", j); 16 printf("s = %x\n", s); 17 printf("sizeof(c + s) = %d\n", sizeof(c + s)); 18 19 return 0; 20 }
运行结果如下:
小结: