图解有符号和无符号数隐藏的含义

有符号数、无符号数、二进制之间的关系

计算机本质上是用二进制表示数据的,所有的数据,不管是什么样的类型,总归是要用二进制表示的。

无符号数就是二进制的值,既是二进制中的每一位乘以其权重,相加起来的。111就是1+2*1+4*1=7。

有符号数是为了表示负数而设计的,即首位为符号位。四位数5(0101)对应的负数为1011(按无符号数读就是11,按有符号数读就是-5,这之间隐藏这关系11 + 5 =16,当然也可以是11 - (-5)=16。而16是四位2进制能表示的所有值。)。计算的方法是0101取反(1010),加1,结果为1011。可以看出在计算机中-5是对应着1011的。

四位的有符号数和无符号对应关系为:随二进制的大小,有符号数的大小呈单调递增非连续的函数。

运算

相加

例如2+3,就是在上面数轴中2后面加3个单元格,到5处。当2+6有符号数时,在上述数轴中就会产生溢出,因为2后面加上6个单元格,就到了二进制的8处,也就是无符号8处,从上图可以看出,它对应了无符号数的-8,产生的溢出。

相减

例如5-2,在数轴上表示就是5和3之间的单元格数,既是2个单元格,结果也就是2。

注意,尽管是两数相减,但最终还是会转化为相加运算。二进制增长的关系如下图(包括溢出),我称它为二进制的回环性(突然想到,这不正符合数据结构环的特性吗):

也可用延续的方式去理解二进制的增长:

当发生2-5时,也即是计算下面标识的单元格数:

首先,按照计算机的计算方式:2加上5的补码,其实补码在数轴上表示的含义就是15和5之间的单元格加1,而加的1是表示0到15之间距离一个单元。那么,2-5自然可以转化为2加上5的补码。
另外一种对2-5的结果是数轴上2到上个5之间的单元数有意思的理解,其实二进制数轴上是按一个单元连续增长的,所以,2对应的二进制减去5对应的二进制自然是2和5之间的距离。就想是十进制的数轴上7-2=5一样一个道理。

巧妙的利用溢出

数据结构环可以巧妙的利用溢出。last_head(2)减去head(5),不用判断,直接2-5,再转化为无符号数,其实就是5到2之间的增长步数。linux内核结构KFIFO既是利用了这个微妙的方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值