目录
简单来说,整型提升指的是 字符型(char)或者短整型(short) 在被使用之前 先转换成 普通整型(int),这就是整型提升。
1、为什么要整型提升
表达式整型运算要在CPU对应的运算器(ALU)中运行,比如表达式 1 + 2 。整型运算器(ALU)要求操作数的字节长度一般是 int 的字节长度,如果是 加法,那就要求加数和被加数的字节长度都是 4 个字节。
但是如果是两个 char 类型的字符相加,char类型的字符仅占 1 个字节,为了满足要求,需要将 char 类型临时提升为 int类型,这个过程就是整型提升。
注意:整型提升仅仅只是在运算的时候,临时提升类型,不会改变char类型变量原本的值。比int类型短的,也就只有 char 、short 两种类型。
2、如何整型提升
整型提升是按照变量的符号位来进行提升的,因此整型提升分为 负数 和 正数 的整型提升。(char 类型、int类型等默认都是有符号类型,即最高位都是符号位)
(1) 负数整型提升
char a = -1;
第一步,先转换成二进制形式(即原码)。原码 = 10000001
第二步,转换成补码(内存中存放的形式)。补码 = 反码 + 1 = 11111110 + 1 = 11111111
第三步,高位补充。char类型是1个字节(8 bit),int类型是4个字节(32 bit),所以需要补上缺少的24 bit,char类型默认是有符号类型,最高位是符号位,补0还是补1由符号位决定。因为 a 的补码最高位符号位为 1,所以要 补 1 。
第四步,变量 a 整型提升以后的结果为 11111111 11111111 11111111 11111111
(2) 正数整型提升
char b = 1;
第一步,先转换成二进制形式(即原码),然后转成补码。补码 = 原码 = 00000001
第二步,高位补充。char类型是1个字节(8 bit),int类型是4个字节(32 bit),所以需要补上缺少的24 bit,补0还是补1由符号位决定。因为 b 的补码最高位符号位为 0,所以要 补 0 。
第四步,变量 b 整型提升以后的结果为 00000000 00000000 00000000 11111111
3、发生整型提升的几种场景
(1) 算术运算过程
a 进行整型提升以后的二进制补码 = 原码 = 00000000 00000000 00000000 00001010
对应的十进制为 10
b 进行整型提升以后的二进制补码 = 11111111 11111111 11111111 10001000
对应的十进制为 -120
此时 a + b = 10 + (-120)= -110
后面需要重新转换成 char类型,然后再赋值给 c
char a = 10;
char b = -8;
char c = a + b; //a,b发生整型提升
printf("%d\n", a); //a 发生整型提升
(2) 比较运算过程
a 转换成二进制是 10110110,整型提升二进制补码形式:11111111 11111111 11111111 10110110
原码为 10000000 00000000 00000000 01001010 ,转换成十进制是 -74
而等号右边的值转换成十进制是 182
因此,if 语句的判断结果为假
char a = 0xb6;
if(a == 0xb6)
{
//...
}