一、整形提升
C语言的整形算数运算总是至少以缺省整形类型的精度来进行的。
为了获得这个精度,表达式中的字符类型和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
所以,整形提升的对象是:字符类型(char
),短整形(short
)。
示例如下:
注意: 整形提升是对补码进行的操作。
二、为什么要整形提升?
表达式的整型运算要在CPU
的相应运算器件内执行,CPU
内整型运算器(ALU
)的操作数的字节长度一般就是int
的字节长度,同时也是CPU
的通用寄存器的长度。
因此,即使两个char
类型的变量相加,在CPU
执行时实际上也要先转换为CPU
内整型操作数的标准长度。
三、截断
截断指的是长字节类型在转换成长字节类型时,进行的取部分比特位的现象。
示例如下:
注意: 截断是对补码进行的操作。
四、示例
截断和整形提升一般会同时出现,而且很容易被忽略,下面通过一个示例来具体了解一下截断和整型提升。
int main()
{
char c1 = 5; // 1
char c2 = 127; // 2
char c3 = c1 + c2; // 3
printf("%d\n",c3); // 4
}
为了方便描述,将上面的几行代码进行了标号,下面我们一部分一部分的看。
1,2
char c1 = 5; // 1
char c2 = 127; // 2
1
,2
是初始化操作,分别将 5
、127
赋值给 c1
、c2
,但是 5
、127
是整形,属于 int
类型,而 c1
、c2
是 char
类型的,所以赋值时由于类型转换会发生的截断。
注意: 截断是对补码进行的操作,而 5
、127
都是正数,原码 = 反码 = 补码。
所以 c1
的值就是 0000 0101
(二进制),c2
的值是 0111 1111
(二进制)。
3
char c3 = c1 + c2; // 3
① c1 + c2
c1
和 c2
是 char
类型 ,两者要相加,需要进行整形提升,都成为 int
类型后,才能做加法。
- 首先我们来看补位要补什么?
① 有符号的类型,高位是符号位,根据符号位补,符号位是几就补几。
② 无符号的类型,由小到大转化,缺位直接补0
。
- c1 和 c2 整形提升
char
类型是有符号类型,两个的最高位都是0
,所以补位都补0
。
- c1 和 c2 相加
两个int
类型相加得到的结果也是int
类型的。
② c3 = c1 + c2
- 赋值时发生截断
刚才我们得到了c1
,c2
相加的结果,是int
类型的,但该结果要赋值给char c3
(1 个字节),从int
到char
需会发生截断。
所以c3
的值就是1000 0100
了。
4
printf("%d\n",c3); // 4
%d
打印的内容是 10
进制的有符号整形。
-
所以首先就是将
char
类型的c3
整形提升成int
类型:
char
类型是有符号类型,符号位是1
,根据符号位进行补位都补1
。 -
然后就是打印
10
进制数字,但此时我们得到的值的补码,要想得到10
进制数字,需要转成原码,转换规则如下:
转换结果:
所以最终打印出来的结果是-124
。
本文到这里就结束了,如果对您有帮助,希望得到一个赞!🌷
如有错漏,欢迎指正!😄