2010-10-31 23 views
5

Sto guardando un'app in java che funziona su entrambi i sistemi a 32 bit e 64 bit e si occupa principalmente di indirizzi IP. Questi indirizzi IP sono mantenuti come numeri interi, e il tipo normale per questo spreca una tonnellata di memoria su piattaforme a 64 bit (e sì, l'uso della memoria ha già dimostrato di essere un problema qui). Come si dichiarano valori interi a 32 bit che rimangono a 32 bit anche su architetture x64?Come si dichiara un numero intero a 32 bit in java?

Come io sono un novizio java, se c'è un tipo built-in che è già progettato per gestire gli indirizzi IP non esitate a farlo notare a me;)

+3

ho pensato 'int' in Java è di tipo a 32 bit ?! – AraK

+0

@AraK - forse lo è, ma non sono sicuro che non si adatta a 64bit sui sistemi x64 e non sto vedendo una risposta definitiva nella documentazione. –

+0

O meglio, lo vedo per int, ma nessun riferimento ovunque per ** unsigned ** int. –

risposta

27

Java ha specifici larghezze per i suoi dati tipi, per la portabilità. Gli integer sono larghi 32 bit anche su piattaforme a 64 bit. I Java language specification stati quite clearly (leggermente parafrasate per rendere più leggibile, a mio parere):

I tipi integrali sono byte, short, int, e lunga, i cui valori sono rispettivamente a 8-bit, 16-bit, 32- bit e complementi a complemento a due parti con firma a 64 bit e char, i cui valori sono numeri interi senza segno a 16 bit che rappresentano unità di codice UTF-16.

Questo è probabilmente a causa di molti problemi di portabilità scoperti in C con le diverse larghezze (e anche codifiche come complemento a due, del complemento e segno quelli/grandezza) di interi che Java sperava di evitare, soprattutto perché era pensato per funzionare su quante più piattaforme possibili.

Per quanto riguarda un tipo predefinito per la gestione degli indirizzi IP, Java ha sia Inet4Address e Inet6Address, a seconda delle esigenze (e del relativo antenato comune, InetAddress).

+1

che dire di unsigned? –

+5

@Joel Java non ha firmato – cobbal

+1

accettato perché ha anche indicato la classe InetAddress –

2

int tipo primitivo di Java hanno una dimensione fissa di 32 bit

2

Utilizza la primitiva int tipo. È a 32 bit su tutte le piattaforme Java; vedi JLS 4.2.1.

e sì, l'uso della memoria è già dimostrato di essere un problema qui

Beh, se lo dici tu.

Non sappiamo cosa stai facendo qui. Ma se siete preoccupati per l'utilizzo della memoria nel rappresentare un enorme numero di indirizzi IP in memoria, allora forse è necessario:

  • non mantengono gli indirizzi IP in memoria,
  • aumentare la dimensione heap Java, o
  • (se necessario) up-size dell'hardware o del sistema operativo.

O forse hai appena ottenuto uno "spreco" di memoria sproporzionato. Java è intrinsecamente affamato di memoria e la risposta pragmatica è lasciare che abbia ciò che vuole.

FOLLOW UP

Java non ha un unsigned int tipo. Ma non è necessario che questo rappresenti gli indirizzi IP, non ultimo perché non è necessario fare aritmetica su di essi.

(E anche se l'hai fatto, ci sono modi per farlo. Tieni presente che se vuoi spremere l'ultima oncia di "spreco" di memoria da un'applicazione Java, avrai bisogno di fare qualcosa di brutto cose)

0

Da http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html:.

I tipi interi sono byte, short, int, e lungo, i cui valori sono 8 bit, 16 bit, 32 bit e 64 bit con segno numeri interi a complemento di due, rispettivamente, e caratteri, i cui valori sono 16 bit interi senza segno che rappresentano caratteri Unicode.

Così int è già a 32 bit, per definizione, anche se l'interprete potrebbe essere messa su un limite di 64 bit in memoria, al fine di accelerare l'accesso.

0

"int"/"Integer" in Java non dipende dalla piattaforma. È sempre a 32 bit. La piattaforma dipendente è com.sun.jna.ptr.IntByReference.

1

Non ti preoccupare, il tipo int in Java è definito (a differenza di C/C++) per essere esattamente a 32 bit, come detto here.

1

int è 32 bit su ogni piattaforma. Tuttavia, per renderlo non firmato, devi spostare manualmente i numeri e cose del genere - diventa davvero complicato. Perché non usare un byte [] o un lungo?

7

L'int sarà 32 bit anche su macchine a 64 bit, non è necessario fare nulla.

dalla lingua specifica Java tipo di dati (http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)

L'int è un 32 bit firmato intero complemento a due. Ha un valore minimo di -2.147.483.648 e un valore massimo di 2.147.483.647 (incluso). Per i valori interi, questo tipo di dati è generalmente la scelta predefinita. Molto probabilmente questo tipo di dati sarà abbastanza grande per i numeri che il tuo programma userà, ma se hai bisogno di un intervallo più ampio di valori, usa invece long.

La differenza principale tra VM java a 32 bit e 64 bit è la dimensione massima dell'heap, ovvero la quantità di memoria che la VM può gestire.

Tuttavia, l'implementazione interna di 64 bit VM avrà un effetto sulla utilizzo della memoria:

In generale, i vantaggi di essere in grado di affrontare grandi quantità di memoria sono dotati di una piccola perdita di prestazioni in macchine virtuali a 64 bit contro l'esecuzione della stessa applicazione su una macchina virtuale a 32 bit. Ciò è dovuto al fatto che ogni puntatore nativo nel sistema occupa 8 byte invece di 4. Il caricamento di questi dati aggiuntivi ha un impatto sull'utilizzo della memoria che si traduce in un'esecuzione leggermente più lenta a seconda di quanti puntatori vengono caricati durante l'esecuzione di il tuo programma Java.

Da: http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_description

0

in Java int è 32 bit. I lunghi sono 64 bit. Quindi se è maggiore di 32 bit hai bisogno di molto.

-1

modo migliore per farlo che si tratta di importare nuove librerie

import java.lang.Object; 
import java.lang.Number; 
import java.lang.Integer; 
You should import these libraries, this will give you a new max values. 
Problemi correlati