C语言:隐式类型转换与强制类型转换

C语言中的类型转换:强制与隐式
本文探讨了C语言中两种类型转换方式:强制类型转换和隐式类型转换。强制类型转换可能导致截断,结果受操作系统大小端影响,并非所有转换都是允许的。隐式类型转换在算术运算、赋值、函数调用和返回时发生,从低到高类型转换安全,反之可能产生截断。举例说明了整型提升现象。

在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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值