java整型量有符号数_有符号整型的数据范围为什么负数比正数多一个

在JAVA中,有符号整型(long,int,short,byte)类型能表示的数据范围总是负数个数比正数要多一个,为什么?

以最简单(位数最短)的byte举例

System.out.println(Byte.BYTES);//输出1

System.out.println(Byte.SIZE);//输出8

System.out.println(Byte.MAX_VALUE);//输出127

System.out.println(Byte.MIN_VALUE);//输出-128

按照通常直觉,正负数不是对称的么,为什么负数最小不是-127,又或正数最大是128呢?

byte类型是8bit表示,那么可以表达的状态就有2^8=256个,如果表示无符号整数可以表达最小2进制00000000到最大2进制11111111(=255)共256个数字。

但是JAVA中整型都是有符号,区分就看第一个bit位,第一个bit如果是0则是正数,如果为1则是负数。看到这里就有疑问了,如果第一个bit位表示符号,那么剩下的7位能表示的范围只能是0到2^7-1=127了,岂不是全部数据范围就是-127~127(包括0)共255个数字,先前我们说了,8bit可以表达256个状态,怎么少了一个呢?

原来正0(00000000)和负0(100000000)都是0,计算意义上看也就是重复表达同样的意义,浪费了一个状态表示。为了不浪费资源,尽可能多的存储数据范围,先贤发明了补码表示负数,即一个负数可以用对应的正数的补码表示,而补码=(正数)原码取反(=反码)+1

现在我们用定义一个byte变量值是-127,内存如何存储呢?即求补码

1.127的2进制原码=01111111,

2.求反码=源码取反=10000000

3.反码加1后变成10000001,这就是-127的2进制表示

OK,现在反过来看,计算机指令看到一个byte类型变量值是10000001,怎么得到-127呢?

就是上面求补码的逆向过程,

1.发现第一bit位是1,知道这是补码,是负数

2.补码减1 得出反码=10000000

3.反码取反得到原码=01111111,这就是正数127的2进制表示

4.因此10000001的值就是-127

接下来继续解释:

byte的最大值为什么是127?

因为第一个bit是符号位,那么正数最大只能是01111111=2^7 - 1 = 127

0的补码和原码是一样的

按照上面补码的求解过程

0的原码=00000000→反码11111111 + 1→补码00000000(最高进位丢弃),嗯,也就是说正负0只用一个状态表示。

为什么byte最小值是-128?

我们已经了解,每一个正数有一个对应的补码表示负数,但是通过上面的分析,我们发现-127~127(包括0也没有重复表示)共255个状态,还有一个状态10000000没有利用,它是多少呢?

1.发现第一bit位是1,知道这是补码,是负数

2.补码减1 得出反码=01111111

3.反码取反得到原码=10000000=(128)(我们说原码时,并没有提符号位,仅仅是2进制表示)

注意补码和原码一致,似乎可以即表示128,也可表示-128,但注意与前面的定义保持一致,也为方便计算机识别处理,首位是1即是负数,因此只能是-128了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值