有符号数的进位溢出问题

学过c语言的都知道,char型变量的取值范围为[-128,127),也就是说,当用一个char型变量来存放数据时,127 + 1 = -128,-128 - 1 = 127。

这个就要涉及到有符号整形变量也就是整数在内存中的存储方式了。也许都听过一个原码反码补码的概念,在计算机中,整形变量存储的方式就是以反码的方式进行存储。

在这里就不介绍反码的发展历程了,我们只需要知道如下概念即可:

  1. 有符号数在计算机中存储时,最高位为符号位;
  2. 正数的符号为位0,负数的符号位为1;
  3. 正数的原码、反码、补码均为其本身;
  4. 负数的补码计算方法为其原码取绝对值然后按位取反再加一。

以半字节长度存储的±5来举例(1byte=8bit,半字节长度为4bit):

源码取绝对值反码补码描述
5010101010101不要想当然认为反码一定会反
-51101010110101011原码先取绝对值再取反+1

我们再来尝试一个特殊的整数:0

源码取绝对值反码补码描述
00000000000000视为正数时的表示
-010000000111110000

0视为负数时的表示,

由于半字节只有四位,

因此进位的1忽略之后

还是0

可以看出补码是解决了0的问题的,这里就用到了进位溢出来保证计算机中0不会出现两种存储方式。回归正题,我们现在再来看看最大值进位溢出的问题,半字节的取值范围为[-8,7)。

7+1,二进制为0111 + 0001 = 1000,按照上述方式逆向解析,1000为负数,因此我们按负数的方式进行逆向解析;先算其绝对值,用补码减一再按位取反:1000 - 1 = 0111,取反得到1000。因此其绝对值为1000也就是8,这个数就是-8。

-8 - 1, -8的原码为1000,反码为0111,补码为1000。因此-8 - 1就是1000 - 0001 = 0111,0111是一个正数,因此其值为7。

再回到char型数就很简单了。char为一个字节也就是8bit,最大值为0111 1111也就是127,最小值为1000 0000也就是减一取反再添负号为-128。

最后,本文仅为自己的理解方式的呈现,若有疑误欢迎批评指正,若有建议欢迎互相交流。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值