为何八位有符号整数的范围是-128~127,而不是-127~128
2015-04-18 20:25
295 查看
八位的带符号的整数,比如JAVA中的byte,c#中的SByte,为什么值域范围都是-128-127而不是-127~128?
事实上,远古时期有些计算机的设计是采用了反码表示有符号数的,因此8位有符号数的范围是-127~127,它的一个缺点是0是有正负。它用一位表示正负数,然对剩余的位数采用取反。
比如,0111 1111表示127,那-127的则是1000 0000。0000 0000表示正的0,而1111 1111则表示成为负0。因此反码作为有符号的整数并未流行。
现在的计算机中,通常将正数的补码来表示其负数,采用补码的好处是在硬件电路的实现上,只要使用一种加法电路就可以处理各种有符号数的加减计算,使得电路设计简单。
而补码计算方式为取反码加1,比如,对于正数0000 0001的一个补码计算,
首先取反码成为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。
事实上,还有一个更好理解的方式,-127的表示方式为1000 0001,那么-128=-127-1
即-128=1000 0001-0000 0001=1000 0000
事实上,远古时期有些计算机的设计是采用了反码表示有符号数的,因此8位有符号数的范围是-127~127,它的一个缺点是0是有正负。它用一位表示正负数,然对剩余的位数采用取反。
比如,0111 1111表示127,那-127的则是1000 0000。0000 0000表示正的0,而1111 1111则表示成为负0。因此反码作为有符号的整数并未流行。
现在的计算机中,通常将正数的补码来表示其负数,采用补码的好处是在硬件电路的实现上,只要使用一种加法电路就可以处理各种有符号数的加减计算,使得电路设计简单。
而补码计算方式为取反码加1,比如,对于正数0000 0001的一个补码计算,
首先取反码成为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。
事实上,还有一个更好理解的方式,-127的表示方式为1000 0001,那么-128=-127-1
即-128=1000 0001-0000 0001=1000 0000
相关文章推荐
- 数据类型:整数最小值为何不是最大值的相反数(为什么八位二进制数表示范围是:-128~127 ) ?
- java中byte的范围为何是-128--127而不是-127--127?
- 关于C中为何一个字节表示有符号数范围是[-128-127]
- 为什么带符号的8位二进制数是-128~127啊!而不是-127~127啊!
- 有符号的范围,-128~+127详解(zt)
- byte为何范围是-128~127
- 8位有符号的取值范围是-128~+127
- 为什么八位二进制表示范围为-128~127?
- byte的范围为何是-128到127
- 八位二进制数为什么表示范围是:-128~~+127?
- java byte为何范围是-128~127
- 八位二进制数为什么表示范围是:-128~~+127?
- 8位有符号的取值范围是-128~+127
- 解读为什么有符号的char可表示范围是-128~+127
- 八位二进制数为什么表示范围是:-128~~+127?
- 有符号的范围,-128~+127详解
- Java 中的真值、机器数、原码、反码和补码:为什么整形的取值范围 不是对称的,比如 byte的取值范围为 -128到127,而不是-128到128或者-127到127?
- 八位二进制数为什么表示范围是:-128~~+127?
- 带符号的char类型取值范围为什么是-128——127
- 有符号的字符变量的取值范围-128到127详细解答