Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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检查平方整数是否导致溢出_Java - Fatal编程技术网

Java检查平方整数是否导致溢出

Java检查平方整数是否导致溢出,java,Java,如何确定整数平方是否导致溢出。所有大于46340的数字的平方值都大于java的最大整数值。因为java将对数字进行包装,对46431进行平方运算得到-2147479015,而对2147483647进行平方运算得到1,所以这会进一步复杂化。同样不幸的是,我不能在Java8中这样做,否则会引发算术异常。那么,有没有其他可能的方法来检查整数平方是否会导致溢出 不完全了解您的用例,但您可以对返回平方值的方法的输入设置限制。这个限制可以是Integer.MAX的sqrt 否则-您可以使用类似于biging

如何确定整数平方是否导致溢出。所有大于46340的数字的平方值都大于java的最大整数值。因为java将对数字进行包装,对46431进行平方运算得到-2147479015,而对2147483647进行平方运算得到1,所以这会进一步复杂化。同样不幸的是,我不能在Java8中这样做,否则会引发算术异常。那么,有没有其他可能的方法来检查整数平方是否会导致溢出

不完全了解您的用例,但您可以对返回平方值的方法的输入设置限制。这个限制可以是Integer.MAX的sqrt


否则-您可以使用类似于
biginger
的方法来执行计算。

不完全了解您的用例,但您可以对返回平方值的方法的输入设置限制。这个限制可以是Integer.MAX的sqrt

public boolean isSquareCauseOverflow(int n) {
    if (n > 46340 || n < -46340) return true;
    else return false;
}
否则-您可以使用类似于
biginger
的内容来执行计算。

公共布尔值IsSquareCaseOverflow(int n){
public boolean isSquareCauseOverflow(int n) {
    if (n > 46340 || n < -46340) return true;
    else return false;
}
如果(n>46340 | | n<-46340)返回true; 否则返回false; }
公共布尔值IsSquareCaseOverflow(int n){
如果(n>46340 | | n<-46340)返回true;
否则返回false;
}
43640的输出:

2147395600
43641的输出:

Exception in thread "main" java.lang.ArithmeticException: Square overflow exception!
    at com.artofcode.test.SecureSquare.square(SecureSquare.java:9)
    at com.artofcode.test.SecureSquare.main(SecureSquare.java:15)
    ...
43640的输出:

2147395600
43641的输出:

Exception in thread "main" java.lang.ArithmeticException: Square overflow exception!
    at com.artofcode.test.SecureSquare.square(SecureSquare.java:9)
    at com.artofcode.test.SecureSquare.main(SecureSquare.java:15)
    ...
同样不幸的是,我不能在Java8中这样做,否则会引发算术异常

这是不对的。整数溢出不会导致异常。只有整数除以零时才会出现异常。这适用于所有现存的Java版本

顺便说一句,没有常规的测试来检查基本整数算术运算1是否导致溢出

对于任何特定情况,您都可以基于数学分析或使用
long
biginger
执行等效操作序列来设计测试

例如:

 int number = ...
 int square = number * number;
 long longSquare = ((long) number) * ((long) number);
 if (square != longSquare) {
     System.out.println("Overflow occurred");
 }
(我认为:上面可能有涉及
Integer.MIN\u VALUE
的边缘情况。如果使用
biginger
则不应该有任何边缘情况。)


在这种情况下,测试它是否会导致溢出是微不足道的,不需要更复杂的替代方案


1-在Java8中,一些新的“精确”整数算术方法被添加到
Math
类中。如果发生溢出,这些函数将抛出算术异常。然而,基本算术运算符的行为没有改变

同样不幸的是,我不能在Java8中这样做,否则会引发算术异常

这是不对的。整数溢出不会导致异常。只有整数除以零时才会出现异常。这适用于所有现存的Java版本

顺便说一句,没有常规的测试来检查基本整数算术运算1是否导致溢出

对于任何特定情况,您都可以基于数学分析或使用
long
biginger
执行等效操作序列来设计测试

例如:

 int number = ...
 int square = number * number;
 long longSquare = ((long) number) * ((long) number);
 if (square != longSquare) {
     System.out.println("Overflow occurred");
 }
(我认为:上面可能有涉及
Integer.MIN\u VALUE
的边缘情况。如果使用
biginger
则不应该有任何边缘情况。)


在这种情况下,测试它是否会导致溢出是微不足道的,不需要更复杂的替代方案



1-在Java8中,一些新的“精确”整数算术方法被添加到
Math
类中。如果发生溢出,这些函数将抛出算术异常。但是,基本算术运算符的行为没有改变。

Simple。看看它是大于46340还是小于-46340!易于理解的看看它是大于46340还是小于-46340!或
返回n>46340是,或者甚至不将其放入函数中。只是想让它对OP.Or
returnn>46340非常明显是,或者甚至不将其放入函数中。只是想让它在运算中非常明显。因为已知Math.sqrt(Integer.MAX_VALUE)大约是46340,所以每次都计算它而不是使用常量似乎很遗憾。@bhspencer,现在我把它当作常量!大约46340使它成为一个神奇的数字,而且不容易理解。因为Math.sqrt(Integer.MAX_VALUE)大约是46340,所以每次都计算它而不是使用常量似乎很遗憾。@bhspencer,现在我把它当作一个常量!大约46340使它成为一个神奇的数字,而且不容易理解。我相信,他是在谈论这个@JiriKremser-鉴于上下文,我不这么认为。他说他不能在Java8中实现“this”,而“this”是他在Java7中可以实现的。显然,这不能指那些方法……”因为它们在Java7中不存在。只有当他指的是原始整数算术.imho,“this”=${subject}:]否时,这句话才有意义。这是前一句中描述的计算。不管怎样,OP的含义是你可以用Java 7而不是Java 8来实现它,如果OP谈论的是纯Java 8的方法,这就没有意义了。我相信,他是在谈论这个@JiriKremser-考虑到上下文,我不这么认为。他说他不能在Java8中实现“this”,而“this”是他在Java7中可以实现的。显然,这不能指那些方法……”因为它们在Java7中不存在。只有当他指的是原始整数算术.imho,“this”=${subject}:]否时,这句话才有意义。这是前一句中描述的计算。无论哪种方式,OP的含义都是可以在Java7中实现,但不能在Java8中实现,如果OP讨论的是纯Java8方法,那么这就没有意义了。