其他分享
首页 > 其他分享> > 为什么byte的最大是2的7次方减一而最小是负2的7次方

为什么byte的最大是2的7次方减一而最小是负2的7次方

作者:互联网

原文链接:https://blog.csdn.net/HzsSoftWorld/article/details/89951633

简书

来我们一步步分析分析:

1.byte占用8位,每位用0或1表示,能够表示256(2^8)个数据。

2.这8位分为符号位(最高位)和数值位(剩余七位),符号位0表示正数,1表示负数。

3.按上一步的理解,容易得到(+127:0111 1111、+1:0000 0001、+0:0000 0000、-0:1000 0000、-1:1000 0001、-127:1111 1111),计算机底层定义了+0(0000 0000)就是0,那么“可怜的-0”又该何去何从呢?计算机遇到这个二进制该如何处理呢?总不能把这两个都对应0吧,这显然是资源浪费。

4.到这里我们都认为最高位是不参与计算数值的,仅仅是一个符号位,按这种思路byte的八位是无论如何也表示不出-128。而“可怜的-0”又不知道自己代表谁,不得而知“可怜的-0”就是-128。(为什么呢?凭什么呢?你说代表-128就代表-128呀!为什么不能是+128、-250、+250.......)。

5.到这里我们已经很粗浅地回答了-128~127中的-128的由来,基本也回答了这个题目。


6.可是然而但是——对于程序员来说,上诉的分析【首先】是结论正确,但是过程错了。错误在于——负数的二进制表示是错误的,比如-127:1111 1111,这是不对的。计算机发现了1111 1111会把它认为是-1而不是-127。【其次】没有解释为什么-0最后表示成-128。

7.计算机基础知识普及:原码、反码、补码
        <1>计算机存储有符号的整数是都是存储它们的补码。Java语言都是有符号位的。
        <2>正数和0的补码、反码是本身原码;所以对于正数来说,可以理解为不存在反码和补码。
        <3>负数的反码是是符号位不变,其它位取反;补码是在负数的基础上加1(符号位不变)。负数就是矫情啊!
        <4>计算机中用补码进行加法运算。

8.接着从人的思考方式理解下当计算机处理1111 1111的过程,首位是1,自然是负数,而且这是补码,那么对应的原码就是,先减1,变成1111 1110,符号位不变,其他取反,变成1000 0001,也就是-1!所以从10000001到11111111依次表示-127到-1。。对之前的分析过程是不是很打脸

标签:0000,补码,减一,1111,128,次方,反码,byte,1000
来源: https://blog.csdn.net/czh500/article/details/102714499