2011-01-21 8 views
18

Nie mogę zrozumieć ten błąd:Operacja arytmetyczna spowodowała przepełnienie. Dodawanie liczb całkowitych()

W tym wywołaniu metody setVolume, głośności = 2055786000 i rozmiar = 93552000. Tom jest własnością Integer, a rozmiar jest również Integer, jak możesz zobaczyć.

Klasa jest częściową klasą klasy encji dbml, jednak właściwość Volume NIE jest kolumną w bazie danych, istnieje tylko w klasie częściowej, jako "właściwość obiektu biznesowego".

Szczegółowy widok pokazuje:

danych> Element: W celu oceny własności indeksowany, nieruchomość musi być wykwalifikowany i argumenty muszą być wyraźnie podana przez użytkownika.

alt text

Co może być przyczyną tego ...?

Odpowiedz

30

Maksymalna wartość liczby całkowitej (który jest znakiem) jest 2147483647. Jeśli ta wartość się przepełni, zostanie zgłoszony wyjątek, aby zapobiec nieoczekiwanemu zachowaniu się programu.

Jeśli ten wyjątek nie zostałby rzucony, miałbyś wartość -2145629296 dla twojego Volume, która prawdopodobnie nie jest pożądana.

Rozwiązanie: Użyj wolumenu Int64. Z maksymalną wartością 9223372036854775807, prawdopodobnie jesteś bardziej bezpieczny.

+0

Podczas napotkania tego błędu tworzyłem sumę pierwszych 10 000 liczb naturalnych. Używałem typu danych Int32 dla zmiennej sumującej. Kiedy zmieniłem go na Int64, problem został rozwiązany. Dzięki. Pomogło! – RBT

7
int.MaxValue = 2147483647 
2055786000 + 93552000 = 2149338000 > int.MaxValue 

Nie można zapisać tej liczby w liczbie całkowitej. Możesz użyć typu Int64, który ma maksymalną wartość 9,223,372,036,854,775,807.

1

Maksymalna wartość FO Int jest 2147483647, tak 2055786000 + 93552000> 2147483647 i spowodowała przepełnienie

2

Wynikowa wartość całkowita jest poza zakresem, jaki może pomieścić typ danych liczbowych.

Spróbuj pomocą Int64

0

2055786000 + 93552000 = 2149338000, który jest większy niż 2^31. Więc jeśli używasz liczb całkowitych ze znakiem, zakodowanych na 4 bajty, wynik operacji nie pasuje i pojawia się wyjątek przepełnienia.

0

Maksymalny rozmiar int wynosi 2147483647. Możesz użyć Int64/Long, który jest znacznie większy.

3

Dla uproszczenia będę używać bajtów:

byte a=250; 
byte b=8; 
byte c=a+b; 

jeśli A, B, i C 'int', można się spodziewać 258, ale w przypadku 'bajt', oczekiwany wynik byłby 2 (258 & 0xFF), ale w aplikacji Windows otrzymujesz wyjątek, w konsoli możesz nie (nie, ale to może zależeć od IDE, używam SharpDevelop).

Czasami jednak takie zachowanie jest pożądane (np. Zależy tylko na niższych 8 bitach wyniku).

Można wykonać następujące czynności:

byte a=250; 
byte b=8; 

byte c=(byte)((int)a + (int)b); 

W ten sposób zarówno 'a' i 'b' są konwertowane do 'int', dodał, następnie odlewane z powrotem do 'bajt'.

Aby być na bezpiecznej stronie, można też spróbować:

... 
byte c=(byte)(((int)a + (int)b) & 0xFF); 

A jeśli naprawdę chcesz to zachowanie, w znacznie prostszy sposób robienia powyższego jest:

unchecked 
{ 
    byte a=250; 
    byte b=8; 
    byte c=a+b; 
} 

Lub zadeklaruj najpierw swoje zmienne, a następnie wykonaj matematykę w sekcji "niezaznaczonej".

Jeśli chcesz wymusić kontrolę przepełnienia, użyj zamiast tego opcji "sprawdzone".

Mam nadzieję, że to wyjaśni sprawy.

Nurchi

P.S.

uwierzcie mi, że wyjątek jest twoim przyjacielem :)

0

Ten błąd wystąpił do mnie, gdy wartość została zwrócona jako -1. # IND powodu dzielenia przez zero. Więcej informacji na IEEE zmiennoprzecinkowych wyjątków w C++ here on SO i by John Cook

Dla kogoś, kto downvoted tę odpowiedź (a nie dlaczego), powód dlaczego ta odpowiedź może być istotne dla niektórych jest to, że dzielenie przez zero doprowadzi do nieskończenie dużej liczby, a zatem wartości, która nie mieści się w Int32 (lub nawet Int64). Tak więc otrzymany błąd będzie taki sam (operacja arytmetyczna spowodowała przepełnienie), ale przyczyna jest nieco inna.

+0

proszę wyjaśnić, dlaczego ta odpowiedź została przyjęta. –

+0

Ja faktycznie przegłosowałem, ponieważ jest to dobra informacja, ale zakładam, że downwise jest, ponieważ tytuł mówi "Dodawanie liczb całkowitych", a ty nie dodajesz liczb całkowitych. – DCShannon

+0

dzięki, i oczywiście masz rację, nie zauważyłem tej części –

Powiązane problemy