2014-10-15 30 views
8

voglio assegnare 4294967295 a una variabile (2^32-1) È ovvio che non posso farlo con Integer, e può farlo con Long.Come uscita il valore assoluto di un numero intero senza segno in Java

Tuttavia, ho notato che Java 8 offre interi non firmati (almeno alcuni metodi).

Qualcuno sa quale sia il metodo, Integer.parseUnsignedInt()? Quando sono entrata "4294967295" a questo, e stampare la variabile, dà l'output come -1 (-2 per 4294967294, -3 per 4294967293 e così via ...)

C'è un modo che io possa ancora avere 4294967295 in una variabile?

Mi manca qualcosa qui?

a=Integer.parseUnsignedInt("4294967295"); 
System.out.println(a); 

Questo dà l'output come -1 ma mi aspettavo 4294967295.

+0

Mostraci il tuo codice che ha creato il numero senza firma –

+0

Non pensare che un numero decimale pensi ad esso come una serie di bit, stai mettendo un numero senza segno in un tipo firmato, se sai quale sia la rappresentazione bit del numero è quindi sai perché stai ricevendo -2 o qualsiasi altra cosa, quindi analizzalo come non firmato per ottenere il decimale che ti aspetti – Neilos

risposta

17

È possibile visualizzare che intero come unsigned int chiamando toUnsignedString():

int uint = Integer.parseUnsignedInt("4294967295"); 
System.out.println(Integer.toUnsignedString(uint)); 

è anche possibile chiamare alcuni altri metodi che interpretano che int come unsigned.

Ad esempio:

long l = Integer.toUnsignedLong(uint); 
System.out.println(l); // will print 4294967295 

int x = Integer.parseUnsignedInt("4294967295"); 
int y = 5; 
int cmp1 = Integer.compareUnsigned(x,y); // interprets x as 4294967295 (x>y) 
int cmp2 = Integer.compare(x,y); // interprets x as -1 (x<y) 
0

C'è un modo che io possa ancora avere 4294967295 in un varible?

Sì. Utilizzare long. (Per me, suona come si sta overthinking esso.)

+0

Posso usare a lungo ma ho trovato int performs più veloce di lungo –

2

Per quanto ho capito https://blogs.oracle.com/darcy/entry/unsigned_api, il supporto non firmato è non fatto con l'introduzione di un nuovo tipo. I valori sono ancora memorizzati in (firmato) int variabili ma forniscono metodi per interpretare il valore come senza segno:

per evitare di affrontare il sovraccarico di valori in scatola e per consentire il riutilizzo degli operatori aritmetici built-in , il supporto API non firmato non introduce nuovi tipi come UnsignedInt con metodi di istanza per eseguire addizioni, sottrazioni, ecc. Tuttavia, la mancanza di tipi non firmati separati a livello Java significa che un programmatore può accidentalmente mischiare valori firmati e non firmati.

È stata utilizzata la versione "non firmata" dell'analisi, ma non viene mostrato il metodo da utilizzare per "stampare la variabile". Probabilmente hai scelto quello predefinito (predefinito).