1.类型之间的转换
C语言中的数据类型可以进行转换
A.强制类型转换
B.隐式类型转换
2.强制类型转换
强制类型转换的语法
A.(Type)var_value;
B.(Type)value;
强制类型转换的结果
A.目标类型能够容纳目标值:结果不变
B.目标类型不能容纳值:结果将产生截断
注意:不是所有的强制类型转换都能成功的,当不能进行强制类型转换时,编译器将产生错误信息
3.强制类型转换的示例程序
#include<stdio.h>
struct TS
{
int i;
int j;
};
int test1()
{
short s = 0x1122;
char c = (char)s; //0x22;
int i = (int)s; //0x00001122
int j = (int)3.1415;//3
struct TS ts;
//如果在32下,不会发生截断,在64位下会发生截断
unsigned int p = (unsigned int)&ts;
//long l = (long)ts;//转换错误,编译错误
//ts = (struct TS)l;//转换错误,编译错误
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;
}
4.隐式类型转换
隐式类型转换
A.编译器主动进行的类型转换
注意:
A.低类型到高类型的隐式类型转换式安全的,不会产生截断
B.高类型到低类型的隐式类型转换式不安全的,导致正确的结果
5.隐式类型转换发生的地方
算术运算式中,低类型转为高类型
赋值运算中,表达式的值转换为左边变量的类型
函数调用时,实参转化为形参的类型
函数返回值,return表达式转换为返回值类型
6.隐式类型转换示例程序
int test2()
{
char c = 'a';
int i = c;
unsigned int j = 0x11223344;
short s = j;
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)); //会转换为int类型 占4个字节
return 0;
}
7.小结
强制类型转换有程序猿负责完成
A.转换可能产生截断
B.转换不区分类型的高低
C.转换不成功时,编译器给出错误信息
隐式类型转换有编译器自动完成
A. 低类型向高类型的转换时安全的
B. 高类型向低类型转换是不安全的
注意:标准C编译器的类型检查是比较宽松的,因此隐式类型转换可能带来意外的错误。 |