Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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中使用正数乘法给出负值的整数 公共类测试{ 公共静态void main(字符串[]args){ 整数和=0; 对于(int i=1;i_Java_Integer - Fatal编程技术网

java中使用正数乘法给出负值的整数 公共类测试{ 公共静态void main(字符串[]args){ 整数和=0; 对于(int i=1;i

java中使用正数乘法给出负值的整数 公共类测试{ 公共静态void main(字符串[]args){ 整数和=0; 对于(int i=1;i,java,integer,Java,Integer,您溢出了32位整数的大小 考虑当i等于10时会发生什么: public class Test { public static void main(String[] args) { int sum=0; for(int i=1;i<10;i++) sum = sum+i*i*i*i*i*i*i*i*i*i; System.out.println(sum); }

您溢出了32位整数的大小

考虑当i等于10时会发生什么:

public class Test {

    public static void main(String[] args) {    
        int sum=0;
        for(int i=1;i<10;i++)
            sum = sum+i*i*i*i*i*i*i*i*i*i;
        System.out.println(sum);                

    }    
}

OUTPUT:619374629

    for(int i=1;i<10;i++)
        sum = sum+i*i*i*i*i*i*i*i*i*i*i;
    System.out.println(sum);        

       OUTPUT:
        -585353335
但32位整数中可以存储的最大正数只有约20亿(2加9个零)

事实上,情况变得更糟!中间的计算将以有限的精度执行,一旦10*10*10*10…的乘法溢出,那么10将被乘以一个奇怪的负数,并且已经是错误的

因此,最终得到的数字似乎没有遵循任何算术规则,但事实上,一旦知道原始整数的存储空间有限,它就非常有意义


解决方案是使用64位
long
并希望您不要溢出,如果您这样做,那么您需要
biginger
您使用的是原语类型。因此,当一个整数溢出时,它只会打印出其中包含的位,该位为负数。如果您想出错,请尝试integer。正如您所预测的那样,您传入了teger范围,尽管会导致无穷大的值(当符号[最高位]被触及时)。

Java将整数数学定义为带符号的2s补码mod 2^32(对于int)和2^64(对于long)。因此,每当整数乘法的结果为2^31或更高时,它都会环绕并变成一个负数。这就是整数数学在java中的工作方式


为什么要投否决票。告诉我谁投否决票的原因,但不说任何投否决票的原因都是不正确的。我没有投否决票,但我理解他们为什么会这样做:这不是解决实际问题的真正问题。这只是对编程101的基本误解。整数溢出在Java中不会引发异常。@LeedianelCrocker基本上,这里的大多数问题都是基于某一点上的“误解”…发表评论指出重复的问题是可以的(因为像这样的问题有很多,简单的搜索会得到结果-这可能值得-1)。但是有些人需要被教导int(Java)只有32位,并且在溢出时不会抛出异常-而div by zero会…如果这种误解存在于实际执行某些操作的代码中,我会同意。但这不是真正的代码。当我使用long而不是int时,它是可以的。但我想知道reasson@PSR这就是我理解的原因。谢谢你的帮助reply@ChristopherW我明白了现在不行,谢谢你的帮助support@PSR即使使用
long
也会出现较大的数字。请尝试
这更像处理器的工作方式,最好添加对@DenisTulskiy的引用:添加相关引用
sum = sum + 100000000000 //1 with 11 zeroes