c语言整形提升和算术转换

整形提升和算术转换

  • 隐式类型转换(整形提升)
  • 算术转换
    • 赋值运算符类型转换
    • 正常表达式类型转换
    • 函数调用类型转换
  • 强制类型转换
  • 总结

隐式类型转换(整形提升)

char类型和short类型的变量在表达式中运算时会发生整形提升变成int类型。
整形提升的方式:
1.无符号数高位补0。
2.有符号数高位补符号位。即:正数高位补0,负数高位补1。

	char a;
	char b = 10;
	char c = 20;
	a = b + c; // 表达式中b和c先转换成int类型,再进行运算
			  //最后将运算结果截断性存到 a 中

算术转换

赋值运算符类型转换

=(赋值号)右边的数据转换成=左边变量的类型后,进行赋值运算。
两种情况:
1.右边量的数据长度大于左边量,会发生截断性赋值,导致精度损失丢失一部分数据。
2.右边量的数据长度大于左边量,不会发生数据丢失。

int a = 1;
float b = 2.2;
a = b;  // b 会先转换成int型变量,丢弃小数部分将正数部分赋值给a。
//赋值完成后 a的值是2。

正常表达式类型转换

表达式求值时,会先转换成相同类型再进行运算。转换的方式是向数据长度大的方向转换,目的是避免精度损失数据丢失。转换方向:char->unsigned char -> short->unsigned short-> int->unsigned int-> long->unsigned long-> float-> double。

int a = 2;
float b = 1.0;
int c = 0;
c = a / b; // a先转换成 float 类型,然后进行运算,运算结果是float类型,再将其转换成int类型赋值给变量c。

函数调用类型转换

实参和形参的类型转换,可以认为是一个赋值过程。形参=实参。因此实参会先准换成形参的类型再赋值。

强制类型转换

使用方式:(类型)变量

	int a = 0;
	float b = 1.5;
	a = (int)b;   //强制转换
	printf("a = %d\n", a);

总结

1.若参与运算的各个量的类型不同,想转换成同一类型,再进行运算。
2.赋值时右边类型转换为左边。
3.其余表达式类型转换按向数据长度增大的方向转换,保证精度不降低。
4.char 和 short类型运算时会转换为int 类型。(整形提升)
5.所有的浮点数都是以double类型运算的,即使表达式中只有float类型也要先转换成double类型。

你可能感兴趣的:(c,c语言)