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ı?
cevap
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
}
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ı
Daha basit bir yaklaşım arıyordum ... Ama her durumda, bunun için teşekkürler .. – Legend
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
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 isevoid 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)
- 1. C# WinForms bir sürgü kontrolü var mı?
- 2. Farenin altındaki kontrolü almanın hızlı bir yolu var mı?
- 3. imleç kontrolü
- 4. Matplotlib kontrolü
- 5. Ses kontrolü?
- 6. Saydamlık kontrolü
- 7. Ekran Yakalama kontrolü
- 8. PHP sözdizimi kontrolü?
- 9. dotnet için hafif, tercih edilir açık kaynak, zorlanabilir etiket kontrolü var mı?
- 10. Visual 2010'da C# windows formunda tekrarlayıcı kontrolü var mı? Ya da bir alternatif?
- 11. Wordpress'te woocommerce üzerindeki giriş alanlarına form kontrolü eklemenin bir yolu var mı?
- 12. Google Finans tarzı kontrolü?
- 13. C# Zaman çizelgesi kontrolü
- 14. C# Montaj Enjeksiyon Kontrolü
- 15. Marshmallow'da el feneri kontrolü
- 16. WPF özel kontrolü için özellik kategorisi ayarlansın mı?
- 17. WPF Sohbet kutusu kontrolü
- 18. Can Perforce ve SourceSafe birlikte var mı?
- 19. Sonsuz Pivot Kontrolü
- 20. WPF radyo düğmesi kontrolü
- 21. Python'da şifre kontrolü
- 22. Hata: maven'de yinelenen sınıf var mı?
- 23. Perl anahtarlarının in-kod kontrolü
- 24. Raylarda spam kontrolü
- 25. XAML'de Kontrolü Yeniden Adlandır
- 26. Atlıkarınca kontrolü durduruldu
- 27. Güncelleme kontrolü 2.0
- 28. Dosya Yükleme Kontrolü çalışmıyor
- 29. Animasyondan sonra kontrolü silme
- 30. Dinamik Radyo Düğmesi Kontrolü
[Tam sayı taşması nasıl algılanır C/C++ içinde?] (http://stackoverflow.com/q/199333/995714) –