转换为其他类型,包括两种,一种是整型提升,一种是算数提升。
整型提升:C的整型算术运算默认至少是以int(或者unsigned int)类型的精度来进行的,表达式中的char类型和short类型在使用之前会被隐式转换成int(或者unsigned int)类型,这种转换被称为整型提升。整型提升是按照变量数据类型的符号位来提升的。
整型提升的原因:表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
举个例子
由于c1和c2都是char类型的变量,在进行表达式运算的时候会发生整型提升,c1的值5存的时候是00000101,c2的值127在存的时候是01111111,原反补相同。再进行c1+c2运算的时候要发生整型提升,补符号位,两个数都是符号位都是0,因此都补0至32位。然后进行加法运算,之后结果是0000 0000 0000 0000 0100 0100,这也是个正数,原反补相同。然后要把这个值存到c3里面,会发生截断,最终c3里面存的是01000100,然而在打印的时候我们的打印格式是以10进制整数打印有符号的整数,首先c3发生整型提升,符号位是1,补1至32位,得到补码,负数,计算出原码之后发现是-124。
整型提升发生的原因:表达式的整型运算要在CPU的运算器(ALU)内进行计算,ALU能够操作的数据的长度一般是int的字节长度,这也是CPU通用寄存器的长度。
观测整型提升的例子
打印结果是只有一个c,因为a和b都会发生整型提升变成负数
打印结果是1,4,4,这是因为第一次打印c没有参与运算,也就无需发生整型提升,但是后面两次打印c都参与了运算,又c是char类型,因此c要发生整型提升,在运算的时候变成int类型,因此打印结果是4。
注:整型提升只针对char类型和short类型,且只会发生在表达式中。
算术转换
如果各个操作数是除char和short类型的其他类型,且属于不同类型,且在运算中除非一个操作数转化为另一个操作数的类型,否则运算无法继续,则会发生算数转换。算数转换的规则是往大的提升,比如int类型的变量和float类型的变量相加,会把int类型的变量转化为float类型的变量。但是这个转换只是为了完成运算操作而临时发生的,并不是说以后这个int类型的变量就成float类型了。