Nasıl Java tamsayı underflows ve taşmaları tanıtıcı ve nasıl kontrol eder misiniz?
Nasıl Java tamsayı underflows ve taşmaları ele?
Bu lider, bu nasıl oluştuğunu/test kontrol eder misiniz?
CEVAP
Eğer taşarsa, geri minimum value gider ve oradan devam ediyor. Eğer underflows, geri maximum value gider ve oradan devam ediyor.
Aşağıdaki gibi önceden kontrol edebilirsiniz
public static boolean willAdditionOverflow(int left, int right) {
if (right < 0 && right != Integer.MIN_VALUE) {
return willSubtractionOverflow(left, -right);
} else {
return (~(left ^ right) & (left ^ (left right))) < 0;
}
}
public static boolean willSubtractionOverflow(int left, int right) {
if (right < 0) {
return willAdditionOverflow(left, -right);
} else {
return ((left ^ right) & (left ^ (left - right))) < 0;
}
}
(long
int
long
aynı denetimleri gerçekleştirmek için yerine kullanabilirsiniz)
Eğer bu çok sık ortaya çıkabilir düşünüyorsanız, o zaman bir türünü kullanarak düşünün ya da daha büyük değerler deposu olan nesne long
örneğin, ya da belki de java.math.BigInteger
. En son, neredeyse taşma yok, mevcut JVM bellek sınırı.
Eğer zaten Java8 olacak olursan, o zaman taşması ArithmeticException
atmak Math#addExact()
Math#subtractExact()
yeni yöntemlerden yararlanabilirler.
public static boolean willAdditionOverflow(int left, int right) {
try {
Math.addExact(left, right);
return false;
} catch (ArithmeticException e) {
return true;
}
}
public static boolean willSubtractionOverflow(int left, int right) {
try {
Math.subtractExact(left, right);
return false;
} catch (ArithmeticException e) {
return true;
}
}
Kaynak kodu here here sırasıyla bulunabilir.
Tabii ki, aynı zamanda hemen boolean
yardımcı bir yöntem onları saklamak yerine kullanabilirsiniz.
Nasıl bir Dize Java sayısal bir tip ol...
Bu nasıl bir dizi kontrol etmek için y...
Nasıl bir Java dosyası varsa kontrol e...
Liste dönüştürmek için nasıl<Tamsay...
Nasıl bir tamsayı çift veya tek olup o...