2009-06-11 20 views
28

¿Qué endianness usa Java en su máquina virtual? Recuerdo leer en alguna parte que depende de la máquina física en la que se está ejecutando, y luego en otros lugares que he leído que siempre es, creo, Big Endian. ¿Cual es correcta?Endianness de la máquina virtual de Java

Respuesta

30

Los datos de multibyte en los archivos class se almacenan big-endian.

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

Un archivo de clase se compone de una corriente de bytes de 8 bits. Todas las cantidades de 64 bits, 32 bits y de 64 bits están compiladas por con lectura en dos, cuatro y ocho bytes consecutivos de 8 bits, respectivamente. Los elementos de datos multibyte siempre se almacenan en orden big-endian, donde los bytes altos son los primeros.

Además, el operando en una instrucción bytecode también es big-endian si abarca múltiples bytes.

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

Si un operando es más de un byte en tamaño, a continuación, se almacena en el byte bigEndian orden de alto orden primero. Para ejemplo, un índice de 16 bits sin signo en las variables locales se almacena como dos bytes sin signo, byte1 y byte2, tales que su valor es (byte1 << 8) | byte2.

Así que sí, creo que se puede decir que la Máquina Virtual de Java utiliza big-endian.

+14

Esta respuesta es muy engañosa. Todas las referencias explican cómo se almacenan los valores de varios bytes en los archivos de clase. Y el archivo de clase usa big endian. Sin embargo, en el tiempo de ejecución, todas las implementaciones de Java que conozco almacenan datos de variables y estructuras de datos en orden nativo de bytes. Lo más probable es que también se aplique a los operandos de instrucción una vez que el archivo de clase se haya cargado en un formato ejecutable mejor. Todo lo demás sería tremendamente lento en pequeñas arquitecturas endian como i386. – Codo

14

Los datos de trabajo reales almacenados en el proceso en ejecución casi con seguridad coincidirán con la duración del proceso de ejecución. En general, los formatos de archivo (incluidos los archivos de clase) estarán en orden de red (big endian).

En general, es difícil saber qué hace la máquina debajo, ya que la máquina virtual la abstrae. No puede convertir short[] en byte[] como puede hacerlo en C y C++. java.nio.ByteOrder.nativeOrder() debería darle la endianess subyacente. La idoneidad coincidente es útil cuando se utilizan almacenamientos intermedios NIO que no son de bytes.

Cuestiones relacionadas