整形提升顾名思义就是当一个变量大小达不到一个整型大小这种表达式里面的数据时候,他就会发生整型提升。
用一些代码来举例子:
int main()
{
char a = 3;//
//00000000000000000000000000000011
//00000011 - a 截断,因为char只有一个字节所以只有八个比特位
char b = 127;
//000000000000000000000001111111
//01111111 - b;
// a 和b都是char类型,自身大小都是1byte
char c = a + b;//需要整形提升
//00000000000000000000000000000011
//00000000000000000000000001111111
//00000000000000000000000010000010 - c
//看最高位是什么就补什么,这两个数据都是补零
//因为char是有符号的所以被截断后就看它的最高位看是否正负数
//然后因为要计算他们的相加需要整形提升,所以我们依据他们的符号位进行提升
//得出结论c
//c也是char类型,所以再进行截断10000010 - c
printf("%d\n", c);
//百分号d是整数意味又要高位提升
//最高位是1,所以全部补1
//1111111111111111111111110000010 - 补码
//补码是电脑用来存储数据的,我们要转换它为原码
//1111111111111111111111110000001 - -1
//1000000000000000000000001111110 - -126
return 0;
}
又因为只有short 和 char两个比int小,所以只有这两个需要整形提升
我们可以看一些关于这三类型的区别
int main()
{
char a = 0xb6;//11010110
//11111111111111111111111111010110
//11111111111111111111111111010101
//10000000000000000000000000101010
short b = 0xb600;
int c = 0xb6000000;
if (a == 0xb6)
printf("a");
if (b == 0xb600)
printf("b");
if (c == 0xb6000000)
printf("c");
return 0;
}
最终打印c,即可知道除了int类型外,其他的都需要整形提升。
可能还会有些迷茫,掰开来说就是在if(a == 0xb6)中, 其实是char类型a和int类型的0xb6来进行比较,则char类型就需要整型提升,short类型也需要整型提升,而c的int类型则和整型一样不需要提升,这样来说你懂了吗hh。
我们再来一个例子,比如说这个:
int main()
{
char c = 1;
printf("%u\n", sizeof(c));//1
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
可以知道的是,+ - 也是运算符,既然要参与运算就需要整形提升,由此可见,打印结果就是1 4 4,就说明了整形提升是存在的。下一篇博客来讲算数转换。