2013-06-20 13 views
7

Da quando ho iniziato a utilizzare eclipse per il progetto euler, ho notato che i numeri grandi diventano talvolta numeri negativi apparentemente casuali. Suppongo che questo abbia qualcosa a che fare con il passare il boudry del tipo.Spesso i numeri grandi diventano negativi

Sarò felice se potessi spiegarmi come vengono generati questi numeri negativi e qual è la logica dietro. Inoltre, come posso evitarli (preferibile non con la classe BigInteger). Danke! =)

+0

Immagino che "usare eclissi" significhi "usare java". Spero tu sappia che eclipse non ha nulla a che fare con il tuo problema – Elazar

+0

Eclipse è solo un IDE. Ciò significa che è solo un luogo in cui modifichi, compili ed esegui il tuo codice. Probabilmente stai scrivendo in Java. –

+1

l'evasione dipende dal tuo problema specifico. a volte non puoi evitare di usare 'Biginteger', a volte puoi. – Elazar

risposta

10

Questa immagine mostra cosa stai cercando. Nel tuo caso sono ovviamente numeri più grandi, ma il principio rimane lo stesso.

Esempi di limiti in Java sono:
int: -2.147.483.648 a 2.147.483.647.
lungo: -9.223.372.036.854.775.808 per 9.223.372.036.854.775.807


Nell'immagine 0000, 0001, ecc, mostra la rappresentazione binaria dei numeri.

Image explaining two's complement

EDIT: In Project Euler spesso si devono pensare a un modo per aggirare i numeri lagre. I problemi sono progettati con numeri così grandi che non è possibile utilizzare il modo ordinario di risoluzione dei problemi. Tuttavia, se trovi che hai davvero bisogno di usarli, ti consiglio comunque di studiare BigInteger. Lo troverai utile a lungo termine, e non è poi così complicato. Ecco un link con molti esempi comprensibili: BigInteger Example

1

In matematica i numeri sono infiniti. Tuttavia nei computer non lo sono. C'è MAX_VALUE per ogni tipo int-like: int, short, long. Ad esempio Integer.MAX_VALUE. Quando si tenta di aumentare il numero più di questo valore, il numero diventa negativo. In questo modo funziona la rappresentazione binaria interna dei numeri.

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

In particolare, diventa 'Integer.MIN_VALUE'. –

+0

Fammi solo verificare - il numero successivo dopo che max_value è -1? (Voglio dire (int) 2^31 + 1 = -1? – user2435678

+0

No, il valore successivo dopo 'Integer.MAX_VALUE' è' Integer.MIN_VALUE' come menzionato da @ Boris lo Spider – AlexR

1

si sono probabilmente traboccante le dimensioni del vostro tipo di dati, dal momento che il bit più significativo è il bit del segno. Non credo che Java abbia i tipi di dati unsigned, quindi potresti provare a utilizzare un tipo di dati più grande come long se desideri contenere numeri più grandi di int. Se stai ancora traboccando uno long, sei praticamente bloccato con BigInteger.

1

Ecco una rappresentazione two's complement per 2-bit integer: (U significa senza segno, S significa firmata)

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

aritmetica avviene principalmente come nel caso senza segno, modulo max (U) (4 nel nostro caso).

La logica è la stessa per i tipi più grandi. int in Java è a 32 bit. Utilizzare long per 64 bit.