我有这个代码:
long i = 0;
while (true) {
i += 10*i + 5;
System.out.println(i);
Thread.sleep(100);
}
为什么long i
几次打印后会变成负片?如果超出范围,是否不应该发生错误?
如果将数字增加到最大值之后,Java不会抛出错误。如果您希望具有此行为,则可以使用Math.addExact(long x, long y)
Java 8中的方法。ArithmeticException
如果传递,则该方法将引发Long.MAX_VALUE
。
Java不会引发异常并且您收到负数的原因与数字的存储方式有关。对于长原语,第一个字节用于指示数字的符号(0->正号,1->负号),其余字节用于数字值。这意味着Long.MAX_VALUE
最大的正值将被存储为01111
…
111(0后跟63的1位)。由于向其添加数字,Long.MAX_VALUE
由于符号字节变为1,因此您将开始接收负整数。这意味着您有数字溢出,但是Java不会引发此错误。
正如标题所说,我不明白Java的原始数据类型的最大值和最小值怎么会小于的最大值和最小值。尽管是64位,是32位。 这是怎么回事?
问题内容: 任何人都可以阐明为什么实际不能使用的最小值吗?它是一个正值,而Double可以当然是负值。 我理解为什么它是一个有用的数字,但它似乎是一个非常不直观的名称,尤其是与相比。 调用它或类似名称将具有更清晰的语义。 另外,Doubles可以取的最小值是多少?是-Double.MAX_VALUE吗 该文档似乎没有说。 问题答案: IEEE 754格式保留一位用于符号,其余位表示幅度。这意味着它
问题内容: 任何人都可以阐明为什么实际不能使用的最小值吗?它是一个正值,而Double可以当然是负值。 我理解为什么它是一个有用的数字,但它似乎是一个非常不直观的名称,尤其是与相比。调用它或类似名称将具有更清晰的语义。 另外,Doubles可以取的最小值是多少?是吗 该文档似乎没有说。 问题答案: IEEE 754格式保留一位用于符号,其余位表示幅度。这意味着它在origo周围是“对称的”(与In
我真的不明白二进制系统是怎么工作的,有人能解释一下为什么当我把它从长到短转换时,它会从正变为负吗? 输出:-32768
基本上,我试图用一个名为“a”的变量设置数组的长度,并将其声明为3和int。当我试图用for循环查看所有元素时,我不会将“null”作为元素。到现在为止,一直都还不错。然而,当有人想向该数组中添加一个元素时,我会向提到的变量“a”中添加1,从而延长该数组的长度,并允许我向该数组中再添加一个元素。但它不起作用。以下是代码: }
问题内容: 我试图检查不同的输入并在java中创建无限循环,我发现一旦超过最大限制,它就会变成负数。我只是在无限循环中增加int … 码: 最后输出的价值是, 现在,为什么会变成负数? 问题答案: 为什么会变成负面? 因为这是在计算溢出时指定在Java中发生的事情。 JLS 15.18.2 “如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与整