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
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).
Nasıl JavaScript devre dışı olup olmad...
Bu nasıl bir dizi kontrol etmek için y...
Nasıl iPhone 5 (geniş ekran cihazlar) ...
nasıl bir python değişken bir fonksiyo...
Nasıl sayfa tüm modern tarayıcılarda y...