什么是整形提升?
在K&R和C89的早期实现中,基于short和char的算术运算陷入两难的困境,因为可能会产生两种不同的结果。因此,在C99中很明确地定义了整型提升的规则. 如果int能够表示原始类型中的所有数值,那么这个数值就被转成int型,否则,它被转成unsigned int型。这种规则被称为整型提升,可能看着这个概念还有点模糊,那么请看一下我下面的代码。
#include<stdio.h>
int main()
{
char a = 3;
//a的补码00000011
char b = 127;
//b的补码01111111
char c = a + b;
//所以a+b得到10000010,即c的结果就是如此
//对c进行整形提升得到(因为c的符号位是1则高位补1)得到\
11111111111111111111111110000010即为一个负数,对负数进行转换需得到的补码减一得到\
11111111111111111111111110000001得到反码,将反码转化为原码得到\
10000000000000000000000001111110即为-(2+4+8+16+32+64) = -126
printf("%d\n", c);//检验结果
//发现a,b均为char类型,没有达到一个int的大小
// 则会发生整形提升
char e = 2;
//e 的 补码为00000010
char d = 1;
//d 的 补码为00000001
char f = e + d;
//相加的结果为00000011(因为f的符号位为0则高位补0)得到\
00000000000000000000000000000011即为1+2)= 3
printf("%d\n", f);
return 0;
}
那么这个时候可能会有朋友问了,如何去判断原反补码对应的长度呢?那么我们就可以去使用sizeof去求对应char(int,float)等的长度,求出来的结果乘与8即可,想了解更多的知识,可以查看《计算机组成原理》