2010-06-14 4 views
5

Trong mã C++ sau, 32767 + 1 = -32768.Làm thế nào để tránh tràn số nguyên?

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

Có cách nào chỉ để nguyên "var" là 32767, không có lỗi?

+0

Bạn có nhận được những gì đang xảy ra ở đây không? Bạn đã nhấn trần cho một số nguyên (viết tắt), do đó, thêm một số khác sẽ lật các dấu hiệu đến số âm tối đa cho một số nguyên. – blu

+0

Nếu bạn muốn có một chế độ khác nơi các số nguyên không tự động quấn quanh, nó không tồn tại, xin lỗi. – dmazzoni

+4

Điều này nhắc tôi về lý do tại sao tôi [không thể ngủ] (http://xkcd.com/571/). :-) –

Trả lời

29

Vâng, đó là:

if (var < 32767) var++; 

Bằng cách này, bạn không nên hardcode hằng số, sử dụng theo quy định tại numeric_limits<short>::max()<limits> tập tin tiêu đề để thay thế.

Bạn có thể gói gọn chức năng này trong một hàm template:

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

và sử dụng nó như:

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

Có, điều đó sẽ hoạt động ... Cảm ơn bạn! – noryb009

+0

Điều đó thật dễ dàng, LOL. –

+2

+1 để triển khai Mẫu. Rất gợi cảm. – chaosTechnician

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

Câu trả lời cho câu hỏi đã được hỏi, nhưng không, tôi nghi ngờ, câu hỏi được dự định. –

0

sử dụng 'unsigned ngắn int' hoặc 'dài int'

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

Sau đó x = 32676; x ++ sẽ dẫn đến x == 32677, không phải là 32676. – geoffspear

+1

OK, vậy làm cách nào để tránh tràn trên số nguyên 64 bit không dấu? – Wizard79