2010-06-14 59 views
5

Aşağıdaki C++ kodunda, 32767 + 1 = -32768.Tam sayı taşması nasıl önlenir?

#include <iostream> 
int main(){ 
short var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 

sadece 32767 olarak "var" ayrılmak için herhangi bir yolu hatasız var mı?

+0

Burada neler oluyor? Bir tamsayı (kısa) için tavana çarptıysanız, bir tane daha ekleyerek işaretleri tamsayı için maksimum negatif miktarına çevirir. – blu

+0

Tam sayıların otomatik olarak etrafından dolanmadığı farklı bir mod istiyorsanız, bu sorun olmaz. – dmazzoni

+4

Bu bana neden uyuyamadığımı hatırlatıyor (http://xkcd.com/571/). :-) –

cevap

29

Evet, var: Bu arada

if (var < 32767) var++; 

, sen sabit hardcode numeric_limits<short>::max() yerine <limits> başlık dosyasında tanımlanmış kullanmamalısınız.

Bir fonksiyon şablonda bu işlevselliği sarabiliriz

: mi

template <class T> 
void increment_without_wraparound(T& value) { 
    if (value < numeric_limits<T>::max()) 
    value++; 
} 

ve kullanmak:

short var = 32767; 
increment_without_wraparound(var); // pick a shorter name! 
+0

Evet, işe yarar ... Teşekkürler! – noryb009

+0

Peki bu kolaydı, LOL. Şablon uygulaması için –

+2

+1. Çok seksi – chaosTechnician

0
#include <iostream> 
int main(){ 
unsigned short var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 
+1

Bu, sorulan soruyu yanıtlıyor, ancak, şüphelenilen, sorulan soruya cevap vermiyor. –

0

kullanımı 'imzasız kısa int' veya 'uzun int'

#include <iostream> 
int main(){ 
long int var = 32767; 
var++; 
std::cout << var; 
std::cin.get(); 
} 
+0

Daha sonra x = 32676; x ++ 32676 x == 32677 ile sonuçlanacaktır. – geoffspear

+1

Tamam, imzasız bir 64 bit tam sayıdaki taşmayı nasıl önlersiniz? – Wizard79