2013-06-20 11 views
7

Odkąd zacząłem używać eclipse dla eulera projektu, zauważyłem, że duże liczby kiedyś stają się pozornie losowymi liczbami ujemnymi. Przypuszczam, że ma to coś wspólnego z przekazywaniem tego typu.Często duże liczby stają się ujemne

Cieszę się, jeśli mógłbyś mi wyjaśnić, w jaki sposób generowane są liczby ujemne i jaka jest logika, która za tym stoi. Ponadto, jak mogę ich uniknąć (najlepiej nie z klasą BigInteger). Danke! =)

+0

Przypuszczam, że "zaćmienie" oznacza "używanie java". Mam nadzieję, że wiesz, że zaćmienie nie ma nic wspólnego z twoim problemem. – Elazar

+0

Eclipse to po prostu IDE. Oznacza to, że jest to miejsce, które edytujesz, kompilujesz i uruchamiasz swój kod. Prawdopodobnie kodujesz w Javie. –

+1

Unikanie zależy od konkretnego problemu. czasami nie można uniknąć używania "Biginteger", czasami można. – Elazar

Odpowiedz

10

To zdjęcie pokazuje, czego szukasz. W twoim przypadku jest to oczywiście większa liczba, ale zasada pozostaje taka sama.
Przykłady limitów w java to:
int: -2,147,483,648 do 2 147 483 647.
długa: -9.223.372.036.854.775.808 do 9.223.372.036.854.775.807


W obrazie 0000, 0001 itd, pokazuje binarną reprezentację liczb.

Image explaining two's complement

EDIT: W Euler projektu często trzeba wymyślić sposób, aby obejść numerów lagre. Problemy są projektowane z liczbami tak dużymi, że nie można używać zwykłego sposobu rozwiązywania problemów. Jeśli jednak okaże się, że naprawdę potrzebujesz ich użyć, sugeruję i tak studiowanie BigInteger. Przekonasz się, że jest to przydatne na dłuższą metę i nie jest to aż tak skomplikowane. Oto link z wieloma zrozumiałymi przykładami: BigInteger Example

1

W matematyce liczby są nieskończone. Jednak w komputerach nimi nie są. Istnieje MAX_VALUE dla każdego typu: int-like: int, short, long. Na przykład Integer.MAX_VALUE. Gdy spróbujesz zwiększyć liczbę większą niż ta wartość, liczba staje się ujemna. W ten sposób działa wewnętrzna binarna reprezentacja liczb.

int i = Integer.MAX_VALUE; 
i++; // i becomes negative. 
+1

Dokładniej, staje się "Integer.MIN_VALUE". –

+0

Po prostu pozwól mi to sprawdzić - następna liczba po max_value wynosi -1? (Mam na myśli (int) 2^31 + 1 = -1? – user2435678

+0

Nie, następna wartość po 'Integer.MAX_VALUE' to' Integer.MIN_VALUE' jak wspomniano przez @Boris the Spider – AlexR

1

Prawdopodobnie przepełniasz rozmiar swojego typu danych, ponieważ najbardziej znaczącym bitem jest bit znaku. Nie sądzę, że Java ma typy danych unsigned, więc możesz spróbować użyć większego typu danych, takiego jak long, jeśli chcesz zachować większe liczby niż int. Jeśli nadal przepełniasz numer long, jesteś prawie utknięty z BigInteger.

1

Oto two's complement reprezentacja 2-bitowej liczby całkowitej (U oznacza bez znaku, S oznacza Signed)

U | bits | S 
--------------- 
0 | 00 | 0 
1 | 01 | 1 \ overflow here: 
2 | 10 | -2/ 1 + 1 = -2 
3 | 11 | -1 

arytmetyczno odbywa się głównie jak w unsigned przypadku modulo max (U) (cztery w tym przypadku).

Logika jest taka sama dla większych typów. int w języku Java to 32-bitowy. Użyj long dla 64 bitów.

Powiązane problemy