为什么二进制【1000 0000】是 -128 而不是【负零】?(记忆向)

文章详细解释了Java中byte类型的8个bit如何表示-128到127的整数范围,强调最高位作为符号位,其余7位表示数值。通过分析全1和全0的二进制形式,得出最大值和最小值。特别讨论了10000000(-128)的情况,以及在补码表示法中的意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java里面的byte是8bit的空间;

一直以来都是知道它是存放的是-128到127的整数;但是怎么更好理解呢?

首先8个bit 最高位表示符号位,0正1负

所以剩下只剩下7个bit来表示数据;

对于能表示多宽范围的值域,正常的思路是把所有二进制bit位变为【全1】;

所以对于8bit的数据最小肯定是个负数,即1开头,后面全1,即【1111 1111】;

理所当然最大的数就是0开头,后面全1,即【0111 1111】;

8bit的各个位的权重如下:

1286432168421

所以对于8位的byte类型,最小的数【直观】(注意,是直观)上是-127,最大的数是127。

不过有两个特殊状态值得注意,一个是1开头的7位全0【1000 0000】,另一个是0开头的全0,即【0000 0000】;后者表示数轴中间状态的0;至此,我们已经有了一个数轴的概念,最左端是-127,最右端是127。而前者【1000 0000】比较特殊,先暂且叫它为【负零】(实际没有这个玩意儿)。

分割线——————————————————————————————

现在就剩下这个【负零】了,也就是【1000 0000】,它为啥是-128呢?

首先紧邻-128的十进制数是-127(即【1111 1111】),高位不动,想要把后面7个1代表的127再增加1,则8位全1加1之后往前进一位,变为【1 0000 0000】,对于8位的byte类型来说,显然这已经超出了8位bit的限制。

但是我们可不可以使用刚才那个【负零】来表示-128呢,显然是可以的,【1000 0000】可以理解为它高位为1,所以是负数,其次,又因为低7位都为零,实际它是【1 0000 0000】当中的后七位的零截取过来的。

另外有一点就是,刚才讨论的都是原码,对于-128的补码是 【1000 0000】(即win10计算器上面的BIN显示补码),而对于16位的容器,-128为:

原码反码补码
1000,0001,0000,00001111,1111,0111,11111111,1111,1000,0000

暂时写到这,还有东西没搞清。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值