java最大值加一等于最小值的理解

我们知道:

byte a = 127;
byte b = (byte) (a+1);
System.out.println(b);//输出:-128

so,为什么呢?

本文不谈原码,反码,补码,笔者准备从另一种角度来和大家一起讨论一下这个问题。

首先需要一些基本的常识:

1.计算机只认识0和1

2.计算机中没有正负号的概念

3.如果需要表示一个数,我们需要先明确这个数是用几个字节来表示的


好的,我们进入正题,假设我们用4个bit来表示一个数,那么它能表示2*2*2*2=16个数,当然,这16个数,我们可以任意指定,想让它表示什么数就表示成什么数,比如可以让它表示比如1~16,0~15,甚至100~115,都可以,看我们心情。计算机只负责存我们让他存的数,它其实不知道是什么,因为这个数是什么是由我们来定义的。

好了,现在有个需求,我们需要让这16个数是连续的整数,且有一半是负数,于是这16个数就表示成了-8 ~ +7,如下图所示

我们发现,如果用[0000]~[0111]表示0~7是完全符合我们正常逻辑的,且刚好都是0开头的,剩下的8个负数都是1开头的,不就刚好体现了符号位吗?而且发现也是刚好符合运算法则的:正数的补码取反+1=负数的补码(比如5->[0101]->取反:[1010]->+1[1011])

继续:7+1=-8也能很好的解释:[0111]+1=[1000],这就是无缝衔接的一个圆,不管加多少,顺时针往后数,数到谁就是谁。

同理,如果是一个byte(即8个bit)表示的是:-128 ~ +127 也可以用这种方式来解释,最后得到的结果:127+1 = [01111111]+1=[10000000] = -128

当然,short  int  long 也一样


这是我自己的理解方式,希望能给大家提供一些思路!

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值