一、什么是整型提升
如果用一句话来说明整型提升那就是:只要是char类型和short类型的数据, 并且被使用或者说是只要参与运算,那么它们就会发生整型提升,被转化为普通整型
二、怎么整型提升
就一句话,无符号数补0,有符号数补符号位的数(符号位是0则补0,是1则补1)
三、实例说明
3.1牛刀小试
char a=1;char b=-1;char c=a+b;
根据以上代码现在c的结果是多少呢?
a和b都是有符号的char类型数据,在c=a+b这个表达式中,a和b都参与了运算,所以要发生整型提升
a的补码为 00000001 整型提升后要转换为32个比特位的int类型,而a此时只有8位,又因为a的符号位是0,所以其他位要补0,最终a整型提升后的补码为:00000000 00000000 00000000 00000001
b的补码为 11111111 ,道理同a,不过a的符号位是1,所以其余位要补1,最终b的补码为:11111111 11111111 11111111 11111111
a+b的补码为 00000000 00000000 00000000,
而c的类型是char类型,它只有8个比特位大小的空间,因此a+b的补码被截断,只有后八位被存入c中,也即是 c=0
3.2初露锋芒
char a=1;
printf("%u \n",sizeof(a));
printf("%u \n", sizeof(+a));
printf("%u \n",sizeof(-a));
毫无疑问,sizeof(a)的结果就是1,但是sizeof(+a)就不同了,a是char类型数据,并且被使用了,使用它会发生整型提升转化为整型,整型占四个字节,所以第二个结果是4,sizeof(-a)和sizeof(+a)完全相同,结果如下:
3.3轻松收尾
char a = 0xb6;
short b = 0xb600
int c = 0xb6000000;
if(a==0xb6)printf("a");
if(b==0xb600)printf("b");
if(c==0xb6000000)printf("c");
上述代码只有成功打印,原因很简单 ,就两点,a和b分别是char,short类型的数据,并且它们都被使用了(if语句里的判等),所以它们会发生整型提升,自然会不同,而c本身是int类型,毫无影响,结果如下: