什么是整形提升?
整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。
为什么需要整形提升?
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 ,一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
在表达式进行计算时,char类型或者各种长度小于int长度的整型值,都要转换为int类型的整型,然后执行运算,进行截断,在进行最后的处理。
接下来我们看一个例子
int main()
{
char a = 3;
char b = 127;
char c = a + b;
printf("%d\n", c);
return 0;
}
我相信很多同学会脱口而出,答案是130
那就大错特错了
我们看看程序跑起来的结果
那为什么答案会得到-126呢?
char a = 3;
3的二进制=00000000000000000000000000000011
截断之后存储的数据 00000011 - a
char b = 127;
127的二进制=00000000000000000000000001111111
截断之后存储的数据 01111111 - b
a和b如何相加
00000000000000000000000000000011
000000000000000000000000001111111
00000000000000000000000010000010
char c = a + b;
10000010-c
11111111111111111111111111110000010 -补码
11111111111111111111111111110000001 -反码
10000000000000000000000001111110 - 补码
所以最后的答案是 -126
整形提升的规则
(1)Signed 类型
整形提升是按照变量的数据类型的符号位进行提升的
高位补充符号位,负数高位补充1
高位补充符号位,正数高位补充0
(2)无符号类型(unsigned)
无符号整形提升,高位全补0