Java 爪哇:为什么;“长”;数字变为负数?

Java 爪哇:为什么;“长”;数字变为负数?,java,long-integer,Java,Long Integer,我有以下代码: long i = 0; while (true) { i += 10*i + 5; System.out.println(i); Thread.sleep(100); } 为什么打印几次后,long i会变成负片?如果超出该范围,是否应该发生错误?如果操作溢出,结果将返回到最小值并从此处继续 没有抛出异常 如果代码可能溢出,则可以使用biginger。如果在最大值之后增加一个数字,Java不

我有以下代码:

    long i = 0;
    while (true) {  
        i += 10*i + 5;
        System.out.println(i);
        Thread.sleep(100);      
    }

为什么打印几次后,
long i
会变成负片?如果超出该范围,是否应该发生错误?

如果操作溢出,结果将返回到最小值并从此处继续

没有抛出异常


如果代码可能溢出,则可以使用
biginger

如果在最大值之后增加一个数字,Java不会抛出错误。如果希望有这种行为,可以使用Java8中的方法。如果传递
Long.MAX_值,此方法将抛出
算术异常


Java不抛出异常而收到负数的原因与数字的存储方式有关。对于长原语,第一个字节用于指示数字的符号(0->正,1->负),而其余字节用于数字值。这意味着最大正值
Long.MAX_VALUE
将存储为01111…111(0后跟63位1)。由于向
Long.MAX\u VALUE
添加了一个数字,您将开始接收负整数,因为符号字节变为1。这意味着您有一个数字溢出,但Java不会抛出此错误。

来自
数学的摘录:

该平台使用带符号2的整数补码算法,具有int和long原语类型。开发人员应该选择原语类型,以确保算术运算始终产生正确的结果,这在某些情况下意味着运算不会溢出计算值的范围。最佳做法是选择原语类型和算法以避免溢出。”

对于Java 8:


如果大小为int或long并且需要检测溢出错误,则addExact、subtractExact、multipleyexact和toIntExact方法在结果溢出时抛出算术异常。对于除法、绝对值、增量、减量和求反等其他算术运算,溢出仅在特定的最小值或最大值时发生,应根据最小值或最大值进行检查“

查找长/整数值的
溢出
”如果超出范围,是否应发生错误?“哪一点会让你们得出这样的结论?你们自己写吧: