繁体   English   中英

Java中的原始数据类型溢出

[英]Primitives data types overflow in Java

int num=Integer.MAX_VALUE*Integer.MAX_VALUE;

为什么这行没有给出Java不兼容的错误,因为结果超出了int的限制?

有人可以详细说明吗?

乘法运算符*允许这样做。 JLS的15.17.1节规定:

如果整数乘法溢出,则结果是数学乘积的低阶位,以某种足够大的二进制补码格式表示。 结果,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同。

简而言之,使用int值,允许溢出并且不是错误。 但是,某些IDE可能将此行标记为警告(IntelliJ似乎对此发出警告)。 但这会编译,当我打印出num ,我得到1 ,这是溢出的结果。

数学上,将x定义为Integer.MAX_VALUE + 1或2 31 然后num是(x-1) 2或(x 2 -2x +1)。 在Java中,当发生溢出时,就好像获取了结果(mod 2 32 ),其结果为1。

Java语言规范为溢出数据类型的计算提供了精确的含义:例如,对int的任何运算都使用结果的32个最低有效位。 没有歧义,也没有理由抛出异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM