关于整形提升的理解

在学习表达式的求值时第一次接触到这个概念,但是并不知道意义。在后面接触到计算机的组成原理的知识后,才对这个概念有了一点自己的理解

首先我们先讨论一下当对两个变量求值时计算机时如何工作的
比如 a = 10; b = 20;c = a+b;
计算机中只有CPU可以进行运算的执行,a和b会放在寄存器中,而寄存器的操作数通常是int的字节长度。
那么如果上面的a b c 的类型都是char类型它们时如何在寄存器中存在的?
a和b的值被提升为普通整型,然后再执行加法运算。
加法运算完成之后,结果将被截断,然后再存储于c中。
a的二进制编码(补码)只有8位 0000 1010
在这里插入图片描述
此时寄存器中:
在这里插入图片描述
截断时看变量的类型选择相应的字节。

整形提升的规则:
a的比特位只有8位,但是寄存器有32位,那么时如何的补齐剩下的24位的?
在这里我自己总结这几点

判断是有符号数还是无符号数(unsigned)
无符号数 全部补0

有符号数看符号位补位
符号位是 1 全部补 1
符号位是 0 全部补 0

切记是看符号位而不是符号。因为其实在赋值时,a = 10;
10就是一段二进制编码放在计算器中,只会根据它的编码进行操作

在这里插入图片描述
比如 :

#include <stdio.h>

int main()
{       
        char a = 128;
	printf("%d",a);
	return 0;
}

这里就是一些常见的坑了,直接上结果:
在这里插入图片描述
这是为啥呢
在这里插入图片描述
这就是上面所说的看编码符号位进行补位而不是看符号。
128在二进制补码 1000 0000
当进行整型提升时寄存器会把这个 1 看作符号位进行补位所以结果是-128

我已经整理一些这方面容易踩坑的练习题,大家可以去博客里找一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值