八位的带符号的整数,好比JAVA中的byte,c#中的SByte,为何值域范围都是-128-127而不是-127~128?c#
事实上,远古时期有些计算机的设计是采用了反码表示有符号数的,所以8位有符号数的范围是-127~127,它的一个缺点是0是有正负。它用一位表示正负数,然对剩余的位数采用取反。ide
好比,0111 1111表示127,那-127的则是1000 0000。0000 0000表示正的0,而1111 1111则表示成为负0。所以反码做为有符号的整数并未流行。设计
如今的计算机中,一般将正数的补码来表示其负数,采用补码的好处是在硬件电路的实现上,只要使用一种加法电路就能够处理各类有符号数的加减计算,使得电路设计简单。it
而补码计算方式为取反码加1,好比,对于正数0000 0001的一个补码计算,class
首先取反码成为1111 1110,而后+1,变成1111 1111。全部-1的表示就是1111 1111硬件
那么问题来了,八位整数中,若是首位表示正数,那么最多就到127,没法128,那么-128是怎么出来的?计算机
若是咱们假设1000 0000表示的是128,取反码,获得的是0111 1111,再加1有变成了1000 0000,也就是128的反码就是它自己,128和-128是一个数。因为在计算机中表示有符号数时,一般将最高有效位为0的认为是正数,最高有效位为1的认为是负数,所以1000 0000就表示为-128了。因此8位有符号整数的范围是-128~127。di
事实上,还有一个更好理解的方式,-127的表示方式为1000 0001,那么-128=-127-1view
即-128=1000 0001-0000 0001=1000 0000vi