整型数据的溢出

之前遇到了一个两个unsigned类型数据相减,结果应为一个负数,但由于返回值类型为unsigned型,却得到了一个大数的情况。这篇文章正好解决了这个问题。

先看几张图:

在计算机中,4位无符号数表示为:

 

有符号数原码表示为,其中,最高位为符号位,01负:

 

有符号数的反码表示为(复习一下什么是反码,原码除符号位,各位取反):

 

有符号数的补码表示为(复习一下,补码是反码末位加一,同时符号位参与进位操作):

 

可能很多人有困惑,1000在反码中表示-7,在补码中怎么就成了-8呢?暂且认为这是一种规定吧,很神奇!

那么我们先来了解一下计算机为什么要用补码?

主要出于两个考虑,一个是减法运算可变为加法运算,另一点是没有正负0这个概念。

减法运算是怎么计算的。看一个例子,如5-6=5+-6=-1,即0101+1010=1111,恰好为-1的补码。再看一个加法溢出的例子,如5+6=11应该是正确的,但0101+0110=1011,为-5

在图中,加法是顺时针移动的,减法是逆时针移动的。

考虑一下补码编码的规律,从100...0-111...1是从负数的最小数(-2^nn代表数-1)到-1,非负数则从00...0001...11顺次增大,最大值为2^n-1

看一段程序的运行结果:

 

INT_MAX+1=01...1+00...1=10...0,为最小负数。

INT_MAX+INT_MAX=01...1+01...1=111...10-2

INT_MIN-1=10...0+111...1=011...1,为最大正数。

INT_MIN+INT_MIN=10..0+10...0=0000,为0

是不是好理解多了?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值