计算机底层-关于隐式转换和补码(困扰了我好几个月的问题)

问题:
C语言程序在32位机器上运行。程序中定义了三个变量X、Y、Z,其中X和Z是int型,Y为short型。当X=127,Y=-9时,执行赋值语句Z=X+Y后,X、Y、Z的值分别是多少?(十六进制数表示)

首先,计算机采用补码计算。
按照正常的思路是这样的:
在这里插入图片描述
很遗憾,这样是错误的!
下面解释原因(困惑了我好几个月)
先说答案:Z = 00000076H

为什么会是这样?我的第一反应是答案错了。事实真是如此吗?
我试着输出一下127的二进制:

int x = 127;
for(int i=31;i>=0;i--)	cout << ((x>>i)&1);
cout << endl;

结果是这样:
在这里插入图片描述

再输出一下-9的补码的二进制:

short y = -9;
for(int i=15;i>=0;i--)	cout << ((y>>i)&1);
cout << endl;

结果是这样:
在这里插入图片描述

也没毛病。


当我将-9当作int类型输出32位二进制位的时候,我发现了问题。

short y = -9;
for(int i=31;i>=0;i--)	cout << ((y>>i)&1);
cout << endl;

结果是这样:
在这里插入图片描述

似乎高位多了很多1。
我恍然大悟:原来发生了隐式转换。(int)+ (short) = (int) + (short)
这种隐式转换小范围转换为大范围后,不会发生数值错误。
即相加的过程应该将Y也当作int类型参与计算。

计算过程应该是这样的:
在这里插入图片描述


(***,谁会想到这种东西做这个的时候会发生隐式转换啊)
自此,问题得到了很好的解决。(要想弄懂底层不是一件容易的事情啊,要会融会贯通)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辽宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值