2009-06-11 3 views
28

Quelle est l'endianness que Java utilise dans sa machine virtuelle? Je me souviens d'avoir lu quelque part que cela dépendait de la machine physique sur laquelle il fonctionnait, et puis d'autres endroits où j'ai lu que c'est toujours, je crois, un gros boutiste. Qui est correct?Endianness de la machine virtuelle de Java

Répondre

30

Les données multi-octets des fichiers class sont stockées en big-endian.

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

Un fichier de classe se compose d'un flux de octets de 8 bits. Toutes les quantités 64 bits de 16 bits, 32 bits et sont construites par en lisant dans deux, quatre et huit octets consécutifs de 8 bits, respectivement. Les éléments de données multi-octets sont toujours stockés dans l'ordre big-endian, où les octets sont prioritaires.

En outre, l'opérande dans une instruction bytecode est également big-endian s'il s'étend sur plusieurs octets.

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

Si un opérande est plus d'un octet taille, il est stocké dans le grand-boutiste ordre d'ordre supérieur Octet. Pour exemple, un indice de 16 bits non signé en les variables locales sont stockées sous forme de deux octets non signés, byte1 et byte2, tels que sa valeur est (byte1 << 8) | byte2.

Alors oui, je pense qu'on peut dire que la machine virtuelle Java utilise big-endian.

+14

Cette réponse est très trompeuse. Toutes les références expliquent comment les valeurs multi-octets sont stockées dans les fichiers de classe. Et le fichier de classe utilise en effet big endian. Cependant, à l'exécution, toutes les implémentations Java que je connais stockent des données de variables et de structures de données dans l'ordre des octets natifs. Cela s'applique aussi probablement aux opérandes d'instruction une fois que le fichier de classe a été chargé dans un meilleur format exécutable. Tout le reste serait extrêmement lent sur les architectures little endian telles que i386. – Codo

14

Les données de travail réelles stockées dans le processus en cours correspondront presque certainement à l'endianess du processus d'exécution. Généralement les formats de fichiers (y compris les fichiers de classe) seront dans l'ordre du réseau (big endian).

Il est généralement difficile de savoir ce que la machine fait en dessous, car elle est extraite par la machine virtuelle. Vous ne pouvez pas lancer un short[] en byte[] comme vous pouvez en C et C++. java.nio.ByteOrder.nativeOrder() devrait vous donner l'endianess sous-jacente. L'endianess correspondante est utile lors de l'utilisation de tampons NIO non-octets.

Questions connexes