2009-06-11 15 views
28

Che endianness utilizza Java nella sua macchina virtuale? Ricordo di aver letto da qualche parte che dipende dalla macchina fisica su cui è in esecuzione, e poi in altri posti ho letto che è sempre, credo, big endian. Che è corretto?Endianness della macchina virtuale Java

risposta

30

I dati multibyte nei file class sono memorizzati big-endian.

Da The Java Virtual Machine Specification, Java SE 7 Edition, Chapter 4: The class File Format:

Un file di classe è costituito da un flusso di byte di 8 bit. Tutte le quantità a 16-bit, 32-bit e 64-bit sono costruite dalla lettura in due, quattro e otto byte consecutivi di 8-bit, rispettivamente. Gli elementi di dati in multibyte vengono sempre memorizzati nell'ordine big-endian, in cui i byte alti vengono prima.

Inoltre, l'operando in un'istruzione bytecode è anche big-endian se si estende su più byte.

Da The Java Virtual Machine Specification, Java SE 7 Edition, Section 2.11: Instruction Set Summary:

Se un operando è più di un byte in dimensioni, allora è memorizzato in big-endian ordine-byte di ordine primo. Ad esempio, un indice a 16 bit senza segno in variabili locali è memorizzato come due byte senza segno, byte1 e byte2 quali che il suo valore è (byte1 << 8) | byte2.

Quindi sì, penso che si possa dire che la Java Virtual Machine utilizza big-endian.

+14

Questa risposta è altamente fuorviante. Tutti i riferimenti spiegano come i valori multibyte sono memorizzati nei file di classe. E il file di classe utilizza infatti big endian. Tuttavia, in fase di esecuzione, tutte le implementazioni Java che conosco dei dati di archivio di variabili e strutture dati nell'ordine di byte nativo. Molto probabilmente si applica anche agli operandi di istruzioni una volta che il file di classe è stato caricato in un formato eseguibile migliore. Tutto il resto sarebbe tremendamente lento su architetture little endian come i386. – Codo

14

I dati di lavoro effettivi memorizzati nel processo in esecuzione corrisponderanno quasi certamente alla endianess del processo in esecuzione. Generalmente i formati di file (compresi i file di classe) saranno in ordine di rete (big endian).

In genere è difficile dire cosa sta facendo la macchina al di sotto, poiché viene allontanata dalla macchina virtuale. Non è possibile trasmettere uno short[] a byte[] come possibile in C e C++. java.nio.ByteOrder.nativeOrder() dovrebbe darti l'endianess sottostante. La corrispondenza con l'endianità è utile quando si utilizzano i buffer NIO non byte.

Problemi correlati