什么是整型提升?
整型提升
是指char类型和短整型(short int),进行任意运算(包括正负转换,逻辑操作,-a,!a也算)时至少要先转换成整型大小后再运算 ( 以%d的形式打印/输入也要整型提升)
整型提升是通过二进制的补码进行的
整型提升是直接在char的8个比特位的补码前补上24个它原来的符号的数,即正数补0,负数补1
在short int 的16个比特位前补上16个它原来的符号的数
无符号(unsigned char/short int)前也补0
例
char类型占一个字节,8个比特位
int类型占4个字节,32个比特位
如char a=3,在内存中存储的补码是
00000011
整型提升后
0000000000000000000000000000011
(占32个比特位)
整型提升后再用整型提升后得到的补码进行运算
为什么要整型提升?
我也不是特别懂,所以我结合了我的理解和我查找到的资料总结了以下
- 运算效率:通常情况下,在对int类型的数值作运算时,CPU的运算速度是最快的。C语言是一个注重效率的语言,所以它会作整型提升,使得程序的运行速度尽可能地快
- cpu适配:表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
难道每次char,short类型计算都要用整型提升后的补码运算吗?
大家可能会想如果每次char,short类型计算都要用整型提升后的补码运算不会太麻烦了吗?
其实并不是每次都要,只要char,short int 类型的数据的值在它的存储范围之内就正常计算就好
因为数据的值在它的存储范围之内时整型提升后的值是不变的
例(有符号char的范围是-128~127)
但是如果char,short int 类型的数据中的值超出了它的范围时
就要用整型提升后的补码运算或者我上一篇文章提到的范围循环计算
用范围循环计算,适用于一些较简单的运算
例
c=126+6超出了它的存储范围,我上次说到127+1根据范围循环存储到有符号char中会变成-128
126+6相当于127+1+4即-128+4,所以结果为-124
什么是截断?
如果把从占字节大的向占字节小类型的强制类型转换或者赋值给占字节小,要发生截断(截断也是用补码),截断时是补码从右向左存
例
整型值存到一个字符变量中
char=-9
-9是int类型的
补码为
11111111111111111111111111110111
因为char只能存八个比特位,所从右向左截断
为11110111
位段中也可能有截断
例
9的补码00001001(只写了前8个比特位)
因为z.sb的空间只有两个比特位所以,9存进去要截断,从右向左存为01,在上图的内存监视中也能看到