在C语言中,进行类型之间的转换有两种转换方式: 强制类型转换与隐式类型转换
- 强制类型转换
语法:(目标类型)变量名或者具体的数值
结果:1、目标类型能够容纳目标值,结果不变
2、目标类型不能容纳目标值,结果产生截断
注意:结果产生截断与操作系统的大小端有关;并不是所有的强制类型转换都能够成功,当不能进行强制类型转换时,编译器会产生错误信息。
例如:
struct S
{
int a;
int b;
};
struct S s;
int main()
{
short t = 0x1122;
char i = (char)t;//0x22,将short转换为char类型,发生了高位截断
int a = (int)t;//0x00001122,将低类型(容量小)的类型转换为高类型,将高位填充0
int b = (int)3.1415;//3,将浮点型数值转换为整数类型,将小数点后的所有数截断
unsigned int p = (unsigned int)&s;//将s结构体类型取地址值转换为无符号整形,32位正常,64位截断因为在32位情况下地址值为4个字节,在64位下为8个字节
long l = (long)s;//错误,因为在C语言中不能将自定义类型转换为内置类型
s = (struct S)l;//错误,在C语言中不能将内置类型转换为自定义类型
system("pause");
return 0;
}
- 隐式类型转换(编译器主动进行的类型转换)
例如:
char c = 0;
short s = c;
int i = s;
long l = i;
注意:从低类型到高类型的隐式类型转换是安全的;而从高类型到低类型的转换是不安全的,会产生截断,从而产生不正确的结果。
1、算术运算中,由低类型转换为高类型
2、赋值表达式中,赋值运算符“=”右边的变量转换为左边的变量类型;
3、函数调用时,实参转换为形参的类型
4、函数返回时,函数返回值,return表达式转换为返回值类型
- 整形提升
例如:
int main()
{
//整形提升
char a = 127;//01111111提升为0000 0000 0000 0000 0000 0000 0111 1111
char b = 3;//00000011提升为0000 0000 0000 0000 0000 0000 0000 0011
char c = a + b;//相加为0000 0000 0000 0000 0000 0000 1000 0010
//c为10000010
//提升后是(因为char为有符号位,高位补符号位),a+b为130,但是char的
//范围是127到-128,则高位补位1,即是1111 1111 1111 1111 1111 1111 1000 0010(补码形式)
//原码是1000 0000 0000 0000 0000 0000 0111 1110即-126
printf("%d\n", c);//-126
system("pause");
return 0;
}
再比如:
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
system("pause");
return 0;
}
结果是1 4 4,c只要参与表达式运算,就会发生整形提升,+c和-c都发生了整形提升,结果是4,而c没有发生,结果是1。
C语言中的类型转换:强制与隐式
本文探讨了C语言中两种类型转换方式:强制类型转换和隐式类型转换。强制类型转换可能导致截断,结果受操作系统大小端影响,并非所有转换都是允许的。隐式类型转换在算术运算、赋值、函数调用和返回时发生,从低到高类型转换安全,反之可能产生截断。举例说明了整型提升现象。
425

被折叠的 条评论
为什么被折叠?



