话不多说,先跑为敬
System.out.println(Long.MAX_VALUE + 1);//-9223372036854775808
这个值是不是很熟悉
System.out.println(Long.MIN_VALUE)//-9223372036854775808
惊不惊喜?意不意外? 所以不单只是地球是圆的? Long的取值范围里也是圆的?
所以这是为啥呢? 可以好好探究下 首先得从java的基本数据类型说起
基本类型
- byte/8
- char/16
- short/16
- int/32
- float/32
- long/64
- double/64
- boolean/~
所以我们说的基本数据类型 “位”到底说的是啥呢? 计算机信息的最小单位是bite 一个bite 就是一个位 以最简单的 变量 boolean为例子,实际上就一位
0:表示true
1:表示false
以最小的数值类型byte为栗子 以8位二进制表示就是
byte s0 = 0b0000_0000;//0 0b貌似表示是bit 没深入研究
System.out.println(s0);
byte s1 = 0b0000_0001;//1
System.out.println(s1);
byte s124 = 0b0111_1111;//127 最大值 至于为啥第一位不能是1?因为第一位表示正负数
System.out.println(s124);
同理可以知道 long是64位的,用二进制表示长啥样呢?这可以借助Long的方法来转换成2进制 先输出long的最大值和最小值看看
System.out.println(Long.toBinaryString(Long.MAX_VALUE));
System.out.println(Long.toBinaryString(Long.MIN_VALUE));
可以看到最大值比最小值少了一位,这是因为long的第一位yes用来控制正负的,我们用手法修正下,前面补0
所以可以看到 当Long.MAX+1 用 二进制位来做加法就会导致第一位变成1吗,其他都变成0 也就变成了Long.MIN 所以就可以联想到好玩的事情
System.out.println(Long.toBinaryString(-Long.MIN_VALUE));
System.out.println(Long.toBinaryString(Long.MIN_VALUE-1));
-Long.MIN输出的数=自己
Long.MIN-1=Long.MAX;
实际上这是因为Long只能读64位,超出了自己读的范围导致二进制“进位”占用符号位或者完全读不到第64位,最后变成了一个意想不到的数字。 所以对于一些超大的数字还是用BigDecimal,避免数值超过位。 想一想一个人有很多很多钱在银行系统,有一天突破上限,最后导致自己“负”了,岂不是很刺激。