Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有趣的事情发生在我取一个数字,乘以10,然后加1_Java_Arrays_String_Integer Overflow - Fatal编程技术网

Java 有趣的事情发生在我取一个数字,乘以10,然后加1

Java 有趣的事情发生在我取一个数字,乘以10,然后加1,java,arrays,string,integer-overflow,Java,Arrays,String,Integer Overflow,这是我正在编写的计算器代码,当然不是全部。这是我在屏幕上显示数字的部分,我已经这样做了,但奇怪的是,这一直工作到10个字符 所以当我让程序显示1111111111后,我想再做一次,它会给我一个奇怪的数字——1773790777。我不明白这个节目是怎么得出这个结论的。如您所见,上面的Display.numbers[]是我存储这两个数字的数组。因此,为了遍历一个位置,我将数组中的数字乘以10,然后加1。那么,这首先是如何给我一个负数的,我能做些什么来解决这个问题呢?你的号码是否溢出了 您可以通过查看

这是我正在编写的计算器代码,当然不是全部。这是我在屏幕上显示数字的部分,我已经这样做了,但奇怪的是,这一直工作到10个字符


所以当我让程序显示1111111111后,我想再做一次,它会给我一个奇怪的数字——1773790777。我不明白这个节目是怎么得出这个结论的。如您所见,上面的Display.numbers[]是我存储这两个数字的数组。因此,为了遍历一个位置,我将数组中的数字乘以10,然后加1。那么,这首先是如何给我一个负数的,我能做些什么来解决这个问题呢?

你的号码是否溢出了

您可以通过查看Integer.MAX_值来检查它,假设您使用的是整数。如果你再重复一遍,你会得到像这样奇怪的结果。请参阅-以了解更多详细信息。

它已溢出

1111111111*10+1=11111111111,十六进制为0x2964619C7。它是一个34位的值,不能存储在32位整数中

在Java中,算术运算在默认情况下是环绕的,因此如果结果溢出,那么它将被环绕回值范围的另一端。看

但是,由于使用了2的补码,结果将是结果11111111111 mod 232=2521176519=0x964619C7的低位,这是32位整数中的-1'773'790'777,这就是您看到数字的原因。你应该多读一些关于二进制的书,这是当今计算机的基础

在Java8中,使用新的*Exact方法可以更容易地检测溢出

该平台使用int和long基元类型的有符号二补整数算法。开发人员应该选择原语类型,以确保算术运算始终产生正确的结果,这在某些情况下意味着运算不会溢出计算值的范围。最佳实践是选择原语类型和算法以避免溢出。在大小为int或long且需要检测溢出错误的情况下,当结果溢出时,addExact、subtractExact、multipleyexact和toIntExact方法会引发算术异常。对于除法、绝对值、增量、减量和求反等其他算术运算,溢出仅在特定的最小值或最大值时发生,应根据最小值或最大值进行检查


仔细阅读整数溢出。好吧,这是不是意味着我需要使用浮点还是双精度?哦,是的,请欣赏下一票。如果你需要非常大的数字,你可以使用长整数或查看大整数-仅供参考,英语中使用时间作为动词来代替乘法几乎是幼儿独有的,即使在非正式用法中也不被普遍接受。不要与介词的用法混淆,意思是乘以,如十乘以四等于四十,这是标准用法。
static int fn = 0;
static int sn = 0;
static boolean running = false;
public static void run()
{
    while (running == true)
    {
        fn = numbers[0];
        sn = numbers[1];            
        if (sign == 0)
        {
            input.setText(String.valueOf(fn));
        }
    }
}
static class one implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        if (Display.sign == 0)
        {
            Display.numbers[0] = Display.numbers[0] *10;
            Display.numbers[0] = Display.numbers[0] +1;
        }
    }
}