本文主要是介绍-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
这篇关于-128的二进制怎么表示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!