Энтузиазм виртуальной машины Java

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

Ответ 1

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

От Спецификация виртуальной машины Java, версия Java SE 7, Глава 4: Формат файла class:

Файл класса состоит из потока 8-разрядные байты. Все 16-битные, 32-битные и 64-битные величины построены по чтение в два, четыре и восемь последовательные 8-битные байты, соответственно. Многобайтовые элементы данных всегда сохраняются в большом порядке, где высокий байты.

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

От Спецификация виртуальной машины Java, версия Java SE 7, Раздел 2.11: Краткое описание набора инструкций:

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

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

Ответ 2

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

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