-128的二进制怎么表示

-128的二进制表示

    今天看到8位2进制表示的范围是-128-127。原来没有想过为什么是这个范围,仔细一想,奇怪呀,-128是怎么表示的。127是0111 1111,而-128为什么是1000 0000呢,这不是-0吗?于是就有了下文要说的一些内容。

STEP1

    为了从根本上明白-128为什么是1000 0000,我们需要从一个叫【模】的东西讲起,并且把你原来关于原码补码反码的一些东西都暂时忘掉。
‘模’是什么,简单来讲就是一个范围内的极限。举一个经典的例子,我们日常生活中的12个刻度的时钟,它表示0-12小时。假设它现在处于2的位置,如果你要让它减少4个小时,到10的位置,你会怎么做?把时钟顺时钟按照3,4,5的方向转8个小时?还是按照1,12,11的方向逆时针转动转4个小时?这2者的结果都是一样的,让时钟到了10的位置。
    我们来看一下,一个是拨了8小时,一个是拨了4小时,8+4=12,12-8=4。一个时钟一圈12个小时,也就是说最大的表示上限是12。往前8小时和往后12-8=4小时效果是一样的。而这个12就是所谓的【模】。在模的范围内,+某个数X与+模-|x|的效果是一样的。举个例子
十进制的数,20 和 80 ,两者相加是100,100为模,那么我们50-20 =30,与50+80=130,如果去除百位上的数字,在模(100)的范围内,是不是都是30,结果相同。也就是X -Y = X+(模-|Y|)。
没错吧。不过上面我们是 大-小,如果是 小-大呢?怎么表示。

|
|
|
↓
STEP2

    还是20这个数字,按照原来是思路10-20=-10,10+(100-20)=90,不相等了对吧,这可怎么办?我们伟大的前人想到了一个办法,将负数用它的绝对值的补数表示也就是“模-|负数x|” 表示。也就是【模】-|负数|,100-|-10|=90;这样是不是就很完美了,可以表示负数了!
    不过这里还存在一个问题,既然-10可以用90表示了,那么原本的90该怎么表示呢?很直接,模范围内一分为二,0-49表示正数,50-99表示负数。

|
|
|
↓
STEP3

    好了,回到-128上。对于8进制的2进制数,模是2的八次,256。如果抛开负数,我们能表示0-255没问题吧。现在我们把0255进行对半分,0-127以及128-255.像上面所说的100一样,,0-127表示正数,128255表示负数补数的负值,也就是说128~255为【模】-|负数x|后的值,256-|-128|=128,256-|-1|=255。到这里你应该明白为什么八位2进制数能够表示的范围是-128-127了吧。 需要注意的是,以上这些运算都需要在-128~127的范围内,这里所谓的负数的二进制码就是它们的补码,不然会产生溢出,也就不符合这个逻辑了。
    接下来我们再看看为什么-128的表示是1000 0000。我们是用256-|-128|=128去表示-128的,128的补码就是1000 0000,这也就是为什么-128是用1000 0000表示了。
    最后说一下计算机是怎么求这个补码的。负数在计算机中都是用补码存储表示的,当我们输入一个负数的时候,计算机还是要用 模-绝对值来求对应的补码,可是计算机只有加法,为了求这个对应的补码,计算机会将原码首位不变,其余位取反然后加1来求这个补码,-128没有原码和反码,只有补码。换个角度考虑,负数的补码就是其绝对值源码+1,-128就是128的原码10000000求反0111 1111 +1 -》1000 0000

参考:https://www.zhihu.com/question/20458542/answer/40759880

  • 50
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值