2009-06-11 4 views
28

Какой смысл использовать Java в своей виртуальной машине? Я помню, где-то читал, что это зависит от физической машины, на которой он работает, а затем в других местах, которые я прочитал, что это всегда, я считаю, большой эндиан. Что правильно?Энтузиазм виртуальной машины Java

ответ

30

Многобайтовые данные в файлах class хранятся в формате big-endian.

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

Класс файл состоит из потока 8-битовых байтов. Все 64-разрядные величины 16-разрядных, 32-разрядных и построены по , представляя два, четыре и восемь последовательных 8-разрядных байтов соответственно. Элементы многобайтовых данных всегда хранятся в порядке big-endian, где на первом месте находятся верхние байт.

Кроме того, операнд в инструкции байткода также имеет большой размер, если он охватывает несколько байтов.

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

Если операнд больше, чем один байт в размера, то она хранится в большой обратный порядок байт порядка высокого порядка байт первого. Для например, беззнаковое индекс 16-бит в локальные переменные хранятся в виде двух беззнаковых байтов, byte1 и byte2, таких , что его значение (byte1 << 8) | byte2.

Так что да, я думаю, можно сказать, что виртуальная машина Java использует big-endian.

+14

Этот ответ очень вводит в заблуждение. Все ссылки объясняют, как многобайтовые значения хранятся в файлах классов. И файл класса действительно использует большой endian. Однако во время выполнения все реализации Java, которые я знаю, хранят данные переменных и структур данных в собственном порядке байтов. Это, скорее всего, также относится к операндам команд после загрузки файла класса в более удобный исполняемый формат. Все остальное было бы чрезвычайно медленным на небольших архитектурных объектах, таких как i386. – Codo

14

Фактические рабочие данные, хранящиеся в текущем процессе, почти наверняка совпадают с окончанием процесса выполнения. Обычно форматы файлов (включая файлы классов) будут в порядке сети (большой конец).

Как правило, трудно сказать, что делает машина под ней, поскольку она абстрагируется от виртуальной машины. Вы не можете наложить short[] на byte[], как вы можете на C и C++. java.nio.ByteOrder.nativeOrder() должен дать вам основную цель. Соответствующая endianess полезна при использовании небайтовых буферов NIO.

Смежные вопросы