Java数据类型溢出

Java数据类型溢出

  • 1. 什么是数据类型溢出
  • 2. 数据溢出产生的原因
  • 3.如何避免数据溢出问题

1. 什么是数据类型溢出

先来看一段代码:

	/**
     * 是否超时
     */
    private boolean isTimeout(Long time, Long interval) {
        if (lastTime + interval < time) {
            return false;
        }
        return true;
    }

上面的代码代码很简单,好像也没有啥问题,但是当interval传入Long.MAX_VALUE时就会出错,因为Long.MAX_VALUE+lastTime发生了数据溢出变成了负数isTimeout(time,Long.MAX_VALUE)永远都是false.

2. 数据溢出产生的原因

Java中的类型都是有符号的,最高位表示符号位,且都有取值范围
基本数据类型 对应的包装类 所占bit位 取值范围
byte Byte 8 -2^7 ~2 ^7-1
short Short 16 -2^ 15 ~ 2^15-1
int Integer 32 -2^ 31 ~ 2^31-1
long Long 64 -2^ 63 ~ 2^63-1

上例中Long.MAX_VALUE就是最大值2^63-1, Long.MAX_VALUE再加任何一个大于0的数都会导致数据超过取值范围,Long.MAX_VALUE首位是0代表是正数,加1后首位变成1,而首位是1代表负数,且超过取值范围的位数会被截取掉,导致结果永远都是错误的

3.如何避免数据溢出问题

上例中的代码可以做如下更改:

	/**
     * 是否超时
     */
    private boolean isTimeout(Long time, Long interval) {
        if (time - lastTime < interval) {
            return false;
        }
        return true;
    }

改成上面的代码后,interval数据不会再执行逻辑操作,也不会有数据溢出的问题存在,当然不同的场景会有不同的解决方案。

你可能感兴趣的:(Java语法知识)