SORU
13 EKİM 2008, PAZARTESİ


Nasıl C/C tamsayı taşması tespit etmek için ?

C Bir programın tüm çözümleri bulmak için yazıyordumbirb=cneredebir,bvecbirlikte tam bir kez tüm rakamları 0-9 kullanın. Programın değerleri sabitlendibirvebve rakam sayma rutin koştu her zamanbir,bvebirbeğer basamak koşul olup olmadığını kontrol etmek.

Ancak, sahte çözümler alınabilirbirbtaşmaları tamsayı sınırı. Bu kodu kullanarak kontrol sona erdi:

unsigned long b, c, c_test;
...
c_test=c*b;         // Possible overflow
if (c_test/b != c) {/* There has been an overflow*/}
else c=c_test;      // No overflow

Taşma için test daha iyi bir yolu var mı? Cips taşma oluştuğunda ayarlanan bir iç bayrak olduğunu biliyorum ama hiç C veya C üzerinden erişilen gördüm .

CEVAP
13 EKİM 2008, PAZARTESİ


Yokbir şekilde bir işlem, en önemli işlenen bir-bit ve ikili-matematik biraz temel bilgi konumlarını kullanarak taşma olasılığı olup olmadığını belirlemek için.

Ayrıca, her iki işlenen (en fazla) biraz büyük işlenen en fazla bir bit yol açacaktır. Örneğin:

bool addition_is_safe(uint32_t a, uint32_t b) {
    size_t a_bits=highestOneBitPosition(a), b_bits=highestOneBitPosition(b);
    return (a_bits<32 && b_bits<32);
}

Çarpma için, her iki işlenen (en) işlenen bitlerin toplamı sonucu. Örneğin:

bool multiplication_is_safe(uint32_t a, uint32_t b) {
    size_t a_bits=highestOneBitPosition(a), b_bits=highestOneBitPosition(b);
    return (a_bits b_bits<=32);
}

Benzer şekilde, bu gibi b güç a sonucu en büyük boyutunu tahmin edebilirsiniz:

bool exponentiation_is_safe(uint32_t a, uint32_t b) {
    size_t a_bits=highestOneBitPosition(a);
    return (a_bits*b<=32);
}

(Tabii ki hedef tamsayı için bit sayısını değiştirin.)

Numarası en yüksek pozisyonu bir bit belirlemek için en hızlı yol olduğundan emin değilim, burada kaba kuvvet yöntemi:

size_t highestOneBitPosition(uint32_t a) {
    size_t bits=0;
    while (a!=0) {
          bits;
        a>>=1;
    };
    return bits;
}

Mükemmel değil, ama bu işlemi yapmadan önce herhangi iki sayı taşma olup olmadığını iyi bir fikir verecek. Bilmiyorum olup olmadığını olur daha hızlı daha basit kontrol sonucu yol önerdi, çünkü döngü highestOneBitPosition işlev, ama olabilir (özellikle bilsen kaç bit olduğunu içinde işlenen önceden).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bethliebert

    bethliebert

    23 EKİM 2008
  • Day9TV

    Day9TV

    22 NİSAN 2010
  • UKF

    UKF

    2 Aralık 2009