Какой смысл использовать 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.