SORU
1 Kasım 2009, Pazar


Nasıl olursa çarparak iki sayı Java taşma neden olur kontrol edebilir miyim?

Çarparak iki sayı birlikte, taşma neden özel durumu işlemek istiyorum. Kod şöyle görünür:

int a = 20;
long b = 30;

// if a or b are big enough, this result will silently overflow
long c = a * b;

Bu basitleştirilmiş versiyonu - gerçek uygulamasında, a ve b başka bir yerde çalışma zamanında temin edilir. Elde etmek istediğim şey bunun gibi bir şey

long c;
if (a * b will overflow) {
    c = Long.MAX_VALUE;
} else {
    c = a * b;
}

Nasıl en iyi önerim bu kod musunuz?

Güncelleme: ve b her zaman benim senaryoda olmayan negatif bir.

CEVAP
1 Kasım 2009, Pazar


Eğer a b Her ikisi de olumlu olursa, o zaman kullanabilirsiniz:

if (a != 0 && b > Long.MAX_VALUE / a) {
    // Overflow
}

Eğer ikisi de pozitif ve negatif sayılar ile uğraşmak zorunda eğer daha karmaşık bir şey

long maximum = Long.signum(a) == Long.signum(b) ? Long.MAX_VALUE : Long.MIN_VALUE;

if (a != 0 && (b > 0 && b > maximum / a ||
               b < 0 && b < maximum / a))
{
    // Overflow
}

İşte küçük bir tablo ben bunu kontrol etmek için tahrik, taşma -10 veya 10 olur gibi:

a =  5   b =  2     2 >  10 /  5
a =  2   b =  5     5 >  10 /  2
a = -5   b =  2     2 > -10 / -5
a = -2   b =  5     5 > -10 / -2
a =  5   b = -2    -2 < -10 /  5
a =  2   b = -5    -5 < -10 /  2
a = -5   b = -2    -2 <  10 / -5
a = -2   b = -5    -5 <  10 / -2

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • MrRandomSong

    MrRandomSong

    29 Kasım 2009
  • Rayone GB

    Rayone GB

    14 Temmuz 2007