来自java文档int has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647 (inclusive)
。
我有一个班级Test.java
。
public class Test
{
public static void main(String[] args)
{
int i=2147483647; //max positive value an int can store
for(;;)
{
System.out.println(++i);
}
}
}
据我所知,++i
应将i
的值增加1并抛出异常,因为2147483648
中不允许使用int
。
但是当我在程序之上运行时它会运行(因为无限循环),而不是将值递增到2147483648
,而是分配给i
的值是-2147483648
,而值每次递减1
。
示例运行(修改类后)
public static void main(String[] args)
{
int i=2147483647;
for(;;)
{
System.out.println(++i);
System.out.println(++i);
System.out.println(++i);
System.out.println(++i);
System.out.println(++i);
break;
}
}
输出:
-2147483648
-2147483647
-2147483646
-2147483645
-2147483644
答案/提示将不胜感激。
答案 0 :(得分:12)
根据我的知识++我应该将i的值递增1并抛出异常,因为int中不允许使用2147483648。
您的理解不正确。整数算术在Java中静默溢出。
如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的二进制补码格式所示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。
答案 1 :(得分:4)
您遇到过称为整数溢出的情况: http://en.wikipedia.org/wiki/Integer_overflow
答案 2 :(得分:2)
这称为整数溢出。对整数值的算术运算永远不会抛出异常,这不仅仅是Java。
最小值和最大值仅用于确定int
是否足以进行计算。
答案 3 :(得分:2)
在java下溢和数值溢出都关闭(无声)。在下溢和溢出事件期间,Java会持续递增/递减数值的范围。
Section 4.2.2. Integer Operations
整数运算符不表示任何溢出或下溢 方式。
答案 4 :(得分:1)
我不会给出确切的答案,但请考虑一下: