SORU
8 HAZİRAN 2010, Salı


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
8 HAZİRAN 2010, Salı


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • Android Central

    Android Cent

    13 Kasım 2008
  • bobinire

    bobinire

    24 EYLÜL 2006