类型转换
类型之间的转换:
- 强制类型转换
- 隐式类型转换
int main()
{
long l = 800;
int i = (int) l;
return 0;
}
int main()
{
int i = 280;
char a = i;
return 0;
}
强制类型转换的结果:
- 目标类型能够容纳目标值:结果不变
- 目标类型不能容纳目标值:结果将产生截断
注意: 并不是所有的类型都能进行强制转换
例子:
#include <stdio.h>
struct TS
{
int i;
int j;
};
struct TS ts;
int main(int argc, char const *argv[])
{
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
",s);
printf("c = %x
",c);
printf("i = %x
",i);
printf("j = %x
",j);
printf("p = %x
",p);
printf("&ts = %p
",&ts);
return 0;
}
结果:
隐式类型转换
编译器主动进行的类型转换
- 当低类型到高类型,不会产生截断
- 当高类型到低类型,会产生截断
隐式类型转换的发生点
- 算术运算中
- 赋值表达式中
- 函数调用中
- 函数返回值
#include <stdio.h>
int main(int argc, char const *argv[])
{
char c = 'a';
int i = c;
unsigned int j = 0x11223344;
short s = j;
printf("c = %c
",c);
printf("i = %d
",i);
printf("j = %x
",j);
printf("s = %x
",s);
printf("sizeof(c+s) = %d
",sizeof(c+s));
return 0;
}
结果:
总结:
- 强制类型转换由程序员负责
- 隐式类型转换由编译器自动完成
注: 标准的C语言编译器的类型检查是比较宽松的,因此
隐式类型转换可能带来意外的错误。