2015-12-18 16 views
5

Dlaczego otrzymuję błąd kompilatora tutaj:Integer wyjątek przepełnienie

int a = 2147483647 + 10; 

a nie tutaj, jeśli mam wykonując tę ​​samą operację:

int ten = 10; 
int b = 2147483647 + ten; 

uczę wykorzystanie sprawdzony a strona internetowa MSDN nie jasne, dlaczego OverflowException jest podniesiona w pierwszym fragmencie kodu:

przez DE błąd, wyrażenie zawierające tylko wartości stałe powoduje błąd kompilatora , jeśli wyrażenie generuje wartość znajdującą się poza zakresem docelowym typu . Jeśli wyrażenie zawiera jedną lub więcej niestałych wartości, kompilator nie wykrywa przepełnienia.

Wyjaśnia tylko zachowanie, ale nie przyczyny tego zachowania. Chciałbym wiedzieć, co dzieje się pod maską.

+1

Otrzymujesz błąd kompilatora, a nie wyjątek w pierwszym przypadku. – CodesInChaos

Odpowiedz

9

Powodem jest, gdy masz int a = 2147483647 + 10; kompilatora można przewidzieć wynik rachunku (a) i będzie wiedzieć, że powoduje przepełnienie ponieważ zarówno i są stałymi, a ich wartości są znane w czasie kompilacji.

Ale kiedy masz

int ten = 10; 
int b = 2147483647 + ten; 

jakiś inny wątek (lub coś innego, może czarodziej, może stanowić zagrożenie w pamięci ...) mógł zmienić wartość ten przed wykonaniem int b = 2147483647 + ten; rachunku a przepełnienia nie można przewidzieć w czasie kompilacji.

+1

Wygrana o 30 sekund ... jesteś szybki. +1 –

+0

ok, kompilator narzeka, gdy ocenia obie liczby, ale nie jest, gdy ocenia liczbę i zmienną "dziesięć". Aby rozpoznać przepełnienie w tym przypadku, musisz użyć sprawdzenia. To trochę niespójności, prawda? – Rober

+1

Jeśli chcesz zachować to samo zachowanie (w czasie wykonywania) po prostu zaznacz pole w ustawieniach projektu, aby "domyślnie" było zaznaczone, a nie "odznacz", lub zawiń kod w zaznaczonym bloku 'checked {int ten = 10; int b = 2147483647 + dziesięć; } ', to również spowoduje ten sam błąd w czasie wykonywania. Nie można uzyskać zachowania podczas kompilacji. –