直接给总结:计算机规定了0000 0000 代表0,1000 0000代表的-0没有意义,必须找个~127~127之外的数和它对应,「人为规定-0就是-128」,而且这么做完美适合计算机做减法运算。
来我们一步步分析分析:
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.计算机基础知识普及:原码、反码、补码
计算机存储有符号的整数是都是存储它们的补码。Java语言都是有符号位的。
正数和0的补码、反码是本身原码;所以对于正数来说,可以理解为不存在反码和补码。
负数的反码是是符号位不变,其它位取反;补码是在负数的基础上加1(符号位不变)。负数就是矫情啊!
计算机中用补码进行加法运算。
8.接着从人的思考方式理解下当计算机处理1111 1111的过程,首位是1,自然是负数,而且这是补码,那么对应的原码就是,先减1,变成1111 1110,符号位不变,其他取反,变成100