当我们进行表达式的计算时,表达式求值之前需要进行类型转换,表达式中的值转换到适当的类型,才开始计算。
就像下面一个示例
int main()
{
char a = 5;
char b = 127;
char c = a + b;
printf("%d ", c);
return 0;
}
在这串代码中,a、b、c的类型都是字符,字符类型的是无法相加减的,那么这里程序就自动将表达式进行类型转换换成整型进行加减,那么得到的结果则是
那么为什么是-124,本篇博客来讲解整型提升的过程。
整型提升
我们知道,char类型在内存中占1个字节,1个字节也就是8个比特,那么我们可以用画图的形式来看
可以看到,当我们定义a和b的时候分别在内存中开辟了各自的空间,每一小格代表了一个比特,八个小格则是一个字节,而a和b都是字符类型的,所以占有一个字节。
而在定义中,我们把a定义成5,b定义成127,分别转换成二进制的表达形式。
可以用计算机来算
再用0补全高位数之后,得到的a和b则是
每个定义的数,系统会自动将定义的数放在一个整型类型,也就是4个字节当中。然后再根据所定义的类型进行截断
就像上图所示,由于char类型占一个字节,所以截断了8个比特位
继续下去,当我们要计算c的时候,就会发生整型提升了,我们得先清楚提升的规则。
1.有符号的整数提升是按照变量的数据类型的符号位来提升的
2.无符号整数提高位补0
由于char类型是有符号整型吗,所以,a和b整型提升后则是
再将提升后的a、b相加,得到的整型二进制是
由于c的类型是char类型,所以我们要截断后八个字节
得到
再对次进行提升,得到
得到了c的补码。由于printf中的函数打印的是原码,所以我们要进行补码换原码的操作
原码计算后得到的十进制数是124,由于符号位是1,所以打印出的应该是-124.
我们看看结果是不是
结果和我们想的一样,这就是整型提升