整形提升和栈的溢出规则

由此先引出一张图片

首先127的原码是01111111,补码是01111111.

128的原码是010000000,此处发生了符号位上溢,这里最高位加的0是为了更好的表示上溢的形式

128的反码是10000000,128的补码是10000000.正好满足char8位bit

之后进行整形提升变成11111111111111111111111110000000,因为128的补码最高位为1,所以是复数所以,printf输出的原码形式为10000000000000000000000010000000,为-128.

下面我们看一个更复杂的例题:

由于16位太多这里我简化成8位

首先-32767的原码是11111111,-32768的原码是100000000(发生了下溢),-32769的原码是100000001,我们对-32769取它的反码是01111110,再取它的补码为01111111,整型提升后为0000...00001111111,此处我们转换成原码是0000...00001111111,在之前我们看作了8位,其实在short int 里面有16位,在这里1的个数为15个,换成原码的值为32767.

 

下面是关于有符号和无符号之间的转换

以上是参考某位博主的代码

在c语言里面,执行按位运算的通常是按照补码形式来进行

比如原码-1,它是有符号的,现在我们使用unsigned来转换它,首先-1的原码是100000...01,补码为111111...11,printf输出其原码对应的数值

 关于栈的使用:假设栈是满栈,其里面都是每次数据类型的范围,我们现在有一个指针,可以定位到每一个在栈里面数据的地址,入栈顺序为数据大小的顺序,关于第一个例子 char 128为什么等于-128,首先signed char的范围在-128到127之间,我们选定127后,指针找寻127上一个地址,发现上溢,指针从栈顶回到栈尾,指向-128,包括例2中首先short int的范围在-32768——32767,关于题目中-32769,指针从-32768向栈尾查找,发现下溢,则指针回到栈顶指向32767。

以上是我本次的第二部作品

谢谢大家!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值