C语言中的隐式转换-------整型提升与算术转换

转换为其他类型,包括两种,一种是整型提升,一种是算数提升。

整型提升:C的整型算术运算默认至少是以int(或者unsigned int)类型的精度来进行的,表达式中的char类型和short类型在使用之前会被隐式转换成int(或者unsigned int)类型,这种转换被称为整型提升。整型提升是按照变量数据类型的符号位来提升的。

整型提升的原因:表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。

举个例子

C语言中的隐式转换-------整型提升与算术转换_第1张图片

由于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语言中的隐式转换-------整型提升与算术转换_第2张图片

打印结果是只有一个c,因为a和b都会发生整型提升变成负数

C语言中的隐式转换-------整型提升与算术转换_第3张图片

打印结果是1,4,4,这是因为第一次打印c没有参与运算,也就无需发生整型提升,但是后面两次打印c都参与了运算,又c是char类型,因此c要发生整型提升,在运算的时候变成int类型,因此打印结果是4。

注:整型提升只针对char类型和short类型,且只会发生在表达式中。

算术转换

如果各个操作数是除char和short类型的其他类型,且属于不同类型,且在运算中除非一个操作数转化为另一个操作数的类型,否则运算无法继续,则会发生算数转换。算数转换的规则是往大的提升,比如int类型的变量和float类型的变量相加,会把int类型的变量转化为float类型的变量。但是这个转换只是为了完成运算操作而临时发生的,并不是说以后这个int类型的变量就成float类型了。

你可能感兴趣的:(c语言,开发语言,c++,数据结构,算法)