- **整形提升**
- **为什么需要整形提升**
- **整形提升的条件**
- **整形提升的规则**
- **引例**
C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
为什么需要整形提升表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsignedint,然后才能送入CPU去执行运算。
什么时候可能会发生整形提升呢?
- 表达式运算
当在进行表达式的计算时,表达式中内存大小小于int(short, char)的都会被提升为整形来进行计算 - 使用操作符时
当整形操作数的长度小于int的长度时就会发生整形提升 - 使用printf打印时
当在使用printf打印时选择的打印类型为%d,%u时就会发生整形提升
对于有符号整形
- 看符号位,若为1(负数)则高位全部补1. 若为0(正数)则高位全补0.
对于无符号整形(unsigned)
- 不管正负数,高位全部补0.
void main()
{
char a = 3;
//00000000000000000000000000000011
//00000011 - a
char b = 127;
//00000000000000000000000001111111
//01111111 - b
char c = a + b;
//发现a和b都是char类型的,都没有达到一个int的大小
//这里就会发生整形提升
//00000000000000000000000000000011
//00000000000000000000000001111111
//00000000000000000000000010000010
//10000010 - c
//11111111111111111111111110000010 - 补码
//11111111111111111111111110000001 - 反码
//10000000000000000000000001111110 - 原码
//-126
//内存储存的是补码,打印的是原码
printf("%dn", c); //-126,如果没有发生整形提升,最后结果应该为130
}


![[C语言]【整形提升】 [C语言]【整形提升】](http://www.mshxw.com/aiimages/31/869667.png)
