L'Endianness de la machine virtuelle Java

Quel endianness Java utilise-t-il dans sa machine virtuelle? Je me souviens avoir lu quelque part que cela dépend de la machine physique sur laquelle il fonctionne, et puis d'autres endroits que j'ai lus que c'est toujours, je crois, big endian. Ce qui est correct?

28
demandé sur JoeCool 2009-06-11 18:47:57

2 réponses

Les données multi-octets dans les fichiers class sont stockées big-endian.

À Partir de La Machine Virtuelle Java de Spécification, Java SE 7 Édition, Chapitre 4: La class Format de Fichier:

Un fichier de classe se compose d'un flux de Octets 8 bits. Tous les 16 bits, 32 bits et Les quantités 64 bits sont construites par lecture à deux, quatre et huit octets 8 bits consécutifs, respectivement. Les éléments de données multioctets sont toujours stockés dans l'ordre big-endian, où le haut octets viennent premier.

De plus, l'opérande d'une instruction bytecode est également big-endian s'il s'étend sur plusieurs octets.

À Partir de La Machine Virtuelle Java de Spécification, Java SE 7 Édition, la Section 2.11: Jeu d'Instructions Résumé:

Si un opérande est plus d'un octet dans taille, puis il est stocké dans big-endian ordre-haut-octet d'ordre en premier. Pour exemple, un index 16 bits non signé dans les variables locales sont stockées comme deux octets non signés, byte1 et byte2, tels que sa valeur est (byte1 << 8) | byte2.

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

30
répondu coobird 2013-12-09 09:22:14

Les données de travail réelles stockées dans le processus en cours correspondent presque certainement à l'endianess du processus en cours 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 dire ce que la machine fait en dessous, car elle est extraite par la machine virtuelle. Vous ne pouvez pas lancer un short[] à byte[] comme vous le pouvez en C et c++. java.nio.ByteOrder.nativeOrder () devrait vous donner l'endianess sous-jacente. Correspondre endianess est utile lors de l'utilisation de tampons NIO non octets.

15
répondu Tom Hawtin - tackline 2009-06-11 15:08:02