什么是整型提升???😇😇
C语言的整型算术运算总是至少以缺省整型类型的精度来进行的
为以这个精度计算,表达式中的字符类型(char)和短整型(short)操作数在使用之前要被转换为普通的整型,这种转换称为整型提升
为什么有整型提升???
因为表达式的整型运算要在CPU的相关运算器件内执行,CPU内的整型运算器(ALU)的操作数的字节长度一般情况下跟int类型的字节长度一样,同时也是CPU的通用寄存器的长度.
所以,如果是两个char(short)类型的数相加,在CPU内部执行时要先将其转换为CPU内整型操作数的标准长度.
因为,通用的CPU是难以直接实现两个1.2字节的数直接相加(机器指令可能可以).所以表达式里面运算里,各种长度小于int长度的整型值,都必须先提升为int或usigned int类型,然后才能送入CPU内进行运算.
如何进行整型提升! ! !
首先我们要了解数据在内存里的存储方式
以int类型的整数13和-13举例:
-
正数:原码=反码=补码 而负数为下面情况
-
原码:数值本身的大小(下面的逗号只是为了方便看,因为一个字节==8个比特位,第一个是符号位,正为0负为1,)
0,0000000,00000000,00000000,00001101— 13
1,0000000,00000000,00000000,00001101— -13 -
反码:就是符号位不变对原码所有位取反(反码只是一个"原码"转"补码"的中间状态,没有什么作用)
0,0000000,00000000,00000000,00001101— 13
1,1111111,11111111,11111111,11110010— -13 -
补码:等于反码加1(内存里实际存储的都是数据的补码而非补码)
0,0000000,00000000,00000000,00001101— 13
1,1111111,11111111,11111111,11110011— -13
正数的整型提升:
char a = 1;
变量a类型为char所以只有1个字节也就是8个二进制比特位(补码存储):
00000000,00000000,00000000,00000001— 1
00000001— a
实际上1是整型由32个二进制比特位组成(4个字节),但是存放在char类型里面(1个字节)放不下,所以只能截断.
char是有符号类型的char
所以如果发生整型提升时,高位全部补充符号位,也就是0
00000000,00000000,00000000,00000001
负数的整型提升
char b = -1;
变量b类型是char所以只有1个字节也就是8个二进制比特位(补码存储):
11111111,11111111,11111111,11111111— -1(补码)
11111111— b
实际上-1是整型由32个二进制比特位组成(4个字节),但是存放在char类型里面(1个字节)放不下,所以只能截断.
char是有符号类型的char
所以如果发生整型提升时,高位全部补充符号位,也就是1
11111111,11111111,11111111,11111111
无符号数的整型提升,高位全补充0
- 且看下面例子:
第一个是sizeof(a)这里面是直接求a在内存里所占字节数(不是一个表达式所以不用整型提升)而下面两个就不同了
这里我们打印用的是%d,而sizeof()里面是+a和-a(有了操作符所以其是一个表达式),而a是char类型不够int类型的字节数,所以需要整型提升,提升后就所占int类型的大小