java里Long类型的数值超过最大值之后是实际运行结果是多少?

735 阅读2分钟

话不多说,先跑为敬

System.out.println(Long.MAX_VALUE + 1);//-9223372036854775808

这个值是不是很熟悉

System.out.println(Long.MIN_VALUE)//-9223372036854775808

惊不惊喜?意不意外? 所以不单只是地球是圆的? Long的取值范围里也是圆的?

所以这是为啥呢? 可以好好探究下 首先得从java的基本数据类型说起

# Primitive Data Types

基本类型

  • byte/8
  • char/16
  • short/16
  • int/32
  • float/32
  • long/64
  • double/64
  • boolean/~

image.png

所以我们说的基本数据类型 “位”到底说的是啥呢? 计算机信息的最小单位是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));

image.png

可以看到最大值比最小值少了一位,这是因为long的第一位yes用来控制正负的,我们用手法修正下,前面补0

image.png

所以可以看到 当Long.MAX+1 用 二进制位来做加法就会导致第一位变成1吗,其他都变成0 也就变成了Long.MIN 所以就可以联想到好玩的事情

System.out.println(Long.toBinaryString(-Long.MIN_VALUE));
System.out.println(Long.toBinaryString(Long.MIN_VALUE-1));

image.png -Long.MIN输出的数=自己 Long.MIN-1=Long.MAX;

实际上这是因为Long只能读64位,超出了自己读的范围导致二进制“进位”占用符号位或者完全读不到第64位,最后变成了一个意想不到的数字。 所以对于一些超大的数字还是用BigDecimal,避免数值超过位。 想一想一个人有很多很多钱在银行系统,有一天突破上限,最后导致自己“负”了,岂不是很刺激。