常识:一个byte数据在计算机中是8位,byte是有符号的,也就是说最高位是符号位,其余7位是数值位。所以1个byte的最大值是:01111111=127。按理说,最小值应该为11111111B=-127才对呀,但是很多官方或权威的书明确提到最小值是-128,这究竟是为什么呢?困扰了我很久。
首先,这里还有一个常识大家要知道,数字在计算机中存储和计算用的都是数字的补码,为什么要这么设计呢?
我们可以用反证法,假设数字计算使用的是原码,比如-1+1,应该等于0才正确,-1+1用转成原码以后进行计算:00000001 +10000001 =10000010 =-2,这就和常识违背了。
为了解决这些实际问题,同时为了CPU的物理结构上更简单(电路上用二极管三极管实现加法器已经很麻烦了,再去实现减法器是不现实的。计算机科学家早就设计好用加法来代替减法了)。因此在计算机存储数据的时候都是存的数据的补码,CPU在计算数据的时候,不是简单的相加。所有数据都要转换成它的补码进行计算。正数的源码反码补码都是其自身,但是负数却发生了改变。
例如:10000001是-1的原码,反码为11111110,补码为1111111。最终计算时都用补码计算,也就是1+(-1)=00000001+11111111=(1)00000000也就是0。这就解决了二进制中-1+1不等于0的问题。
那-128究竟是怎么来的呢?
正数部分的取值范围,最终的补码(正数源码反码补码是一样的)00000000B-01111111B也就是0-127。
负数部分的补码为10000001-11111111,转回到原码应该是11111111-10000001十进制为-127 -(-1)
到这里没懵逼吧,最重要的一点来了。补码里面还有一个没有用。它就是10000000B
这个没法转成原码反码了,直接规定10000000B这个补码对应的是-128。这就是神奇的-128的来源
当然原码为(10000000B)是没有任何意义的。原码的-0没有意义,补码的-0有意义在有符号数里表示-2的(n-1)次方。