2010-03-08 32 views
10

Belirli bir veri türünün (uint32, int, vb.) Taşmasını veya düşük akışını kontrol etmenin genel bir yolu var mı? 4294963846.C++'da taşma/taşma kontrolü var mı?

+0

[Tam sayı taşması nasıl algılanır C/C++ içinde?] (http://stackoverflow.com/q/199333/995714) –

cevap

9

sonucu kontrol aritmetik aşırı/aşağı taşma kontrol etmek için: Ben yazdırdığınızda

uint32 a,b,c; 
... //initialize a,b,c 
if(b < c) { 
    a -= (c - b) 
} 

bir bazı tekrarlamadan sonra, bu gibi çok sayıda görüntüler:

Böyle bir şey yapıyorum orijinal değerlerle karşılaştırılmıştır. sizin spesifik bilgiler için

uint32 a,b; 
//assign values 
uint32 result = a + b; 
if (result < a) { 
    //Overflow 
} 

kontrolü aşağıdaki gibidir

if (a > (c-b)) { 
    //Underflow 
} 
+0

Teşekkürler. Bu durum şu an için iyi görünüyor ... – Legend

+0

bu, taşma durumunda cevabın her zaman imzalı (negatif tamsayı) olacağıdır. – Faizan

+0

İmzasız tamsayıların taşması hiçbir zaman imzalanmaz; orijinal değerlerden daha küçük bir işaretsiz tam sayı olacaktır. –

4

ben veri türü taklit bir sınıf vereceğini yapmak istiyorsa tahmin ve yavaş hangi olurdu (manuel olarak yapmak Ben ... bunun yerine bir typedef tanımlamak bir kullanarak rüzgar gerekebilir,

class MyInt 
{ 
    int val; 
    MyInt(const int&nval){ val = nval;} // cast from int 
    operator int(){return val;} // cast to int 

    // then just overload ALL the operators... putting your check in 
}; 

//typedef int sint32; 
typedef MyInt sint32; 

bundan daha zor olabilir) hayal ediyorum

Belleğin sınırların dışına nasıl yazıldığını kontrol etmek için işaretçilerle benzer bir şey yaptım. çok yavaş ama belleğin bozuk olduğu yer bulamadı

+0

Daha basit bir yaklaşım arıyordum ... Ama her durumda, bunun için teşekkürler .. – Legend

+0

Bu [SafeInt] adlı bir sürümü var (http: //safeint.codeplex .com /) bu gece hakkında öğrendim. Muhtemelen performans kritik kodunda değil, çoğu zaman böyle bir şey kullanmak kötü bir fikir değildir. – HostileFork

2

Cert, tanımlanmamış bir davranış olan signed integer overflow ve unsigned wrapping için iyi bir referansa sahiptir ve bunlar tüm operatörleri kapsamaz ve kapsamaz.

void func(unsigned int ui_a, unsigned int ui_b) { 
    unsigned int udiff; 
    if (ui_a < ui_b){ 
    /* Handle error */ 
    } else { 
    udiff = ui_a - ui_b; 
    } 
    /* ... */ 
} 

ve sonrası koşullarla

: Eğer gcc 5 ise

void func(unsigned int ui_a, unsigned int ui_b) { 
    unsigned int udiff = ui_a - ui_b; 
    if (udiff > ui_a) { 
    /* Handle error */ 
    } 
    /* ... */ 
} 

sen __builtin_sub_overflow kullanabilirsiniz

belge şöyle önkoşulları kullanıyor çıkarmasında imzasız sarma için aşağıdaki kontrol kodu sağlar :

__builtin_sub_overflow(ui_a, ui_b, &udiff)