表达式求值 - 整形提升和截断

一、整形提升

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

12 是初始化操作,分别将 5127 赋值给 c1c2,但是 5127 是整形,属于 int 类型,而 c1c2char 类型的,所以赋值时由于类型转换会发生的截断。

注意: 截断是对补码进行的操作,而 5127 都是正数,原码 = 反码 = 补码。

在这里插入图片描述
所以 c1 的值就是 0000 0101(二进制),c2 的值是 0111 1111(二进制)。

3

char c3 = c1 + c2;  // 3

① c1 + c2

c1c2char 类型 ,两者要相加,需要进行整形提升,都成为 int 类型后,才能做加法。

  • 首先我们来看补位要补什么?
    ① 有符号的类型,高位是符号位,根据符号位补,符号位是几就补几。
    ② 无符号的类型,由小到大转化,缺位直接补0
    在这里插入图片描述
  • c1 和 c2 整形提升
    char 类型是有符号类型,两个的最高位都是 0,所以补位都补 0
    在这里插入图片描述
  • c1 和 c2 相加
    在这里插入图片描述
    两个 int 类型相加得到的结果也是 int 类型的。

② c3 = c1 + c2

  • 赋值时发生截断
    刚才我们得到了c1c2相加的结果,是 int 类型的,但该结果要赋值给 char c3(1 个字节),从 intchar 需会发生截断。
    在这里插入图片描述
    所以 c3 的值就是 1000 0100 了。

4

printf("%d\n",c3);  // 4

%d 打印的内容是 10 进制的有符号整形。

  • 所以首先就是将 char 类型的 c3 整形提升成int类型:
    在这里插入图片描述
    char 类型是有符号类型,符号位是 1,根据符号位进行补位都补 1

  • 然后就是打印 10 进制数字,但此时我们得到的值的补码,要想得到 10 进制数字,需要转成原码,转换规则如下:
    在这里插入图片描述
    转换结果:
    在这里插入图片描述
    所以最终打印出来的结果是 -124


本文到这里就结束了,如果对您有帮助,希望得到一个赞!🌷
如有错漏,欢迎指正!😄

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值