当前位置: 首页 > 面试题库 >

Java:为什么“长”数变为负数?

柳翼
2023-03-14
问题内容

我有这个代码

    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 “如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与整