Кодирование JavaScript Endian?

Ответ на SO заставлял меня думать, не гарантирует ли JavaScript определенную кодировку endian в ОС и браузерах?

Или другим способом являются побитовые сдвиги на целых "безопасных" в JavaScript?

Ответ 1

Да, они в безопасности. Хотя вы не получаете преимущества скорости, на которые вы можете надеяться, поскольку операции с битами JS " взломать".

Ответ 2

Смещение безопасно, но ваш вопрос является ошибочным, потому что endianness не влияет на операции бит-сдвига в любом случае. Сдвиг влево одинаковый в системах с большим и низким порядком на всех языках. (Смещение права может отличаться, но только из-за интерпретации знакового бита, а не для относительных положений любых битов.)

Endianness включается только в том случае, если у вас есть возможность интерпретировать некоторый блок памяти как байты или как большие целочисленные значения. В общем, Javascript не дает вам эту возможность, так как вы не получаете доступ к произвольным блокам памяти, особенно не к блокам памяти, занимаемым переменными. Типизированные массивы предлагают представления данных чувствительным для пользователя способом, но порядок зависит от хост-системы; это не обязательно одно и то же для всех возможных сред Javascript-хоста.

Endianness описывает порядок физического хранения, а не порядок логического хранения. Логически, самый правый бит всегда является наименее значимым. Является ли этот бит-байт тем, который находится на самом нижнем адресе памяти, является полностью отдельной проблемой, и это имеет значение только тогда, когда ваш язык предоставляет такую ​​концепцию, как "наименьший адрес памяти", который нет в Javascript. Типизированные массивы выполняются, но только в контексте типизированных массивов; они по-прежнему не предоставляют доступ к хранению произвольных данных.

Ответ 3

Некоторые из этих ответов датируются, потому что endianness может иметь значение при использовании типизированных массивов! Рассмотрим:

var arr32 = new Uint32Array(1);
var arr8 = new Uint8Array(arr32.buffer);
arr32[0] = 255;
console.log(arr8[0], arr8[1], arr8[2], arr8[3]);

Когда я запускаю его в консоли Chrome, он дает 255 0 0 0, что указывает на то, что моя машина малозначительна. Тем не менее, типизированные массивы используют системную сущность по умолчанию, поэтому вместо 0 0 0 255 вы можете видеть 0 0 0 255, если ваша машина имеет большой размер.

Ответ 4

являются побитовыми сдвигами по целым числам "безопасным" в JavaScript?

Только для целых чисел, которые соответствуют 32 битам (знак 31 +). В отличие от, скажем, Python, вы не можете получить 1 < 40.

Вот как побитовые операторы определены для работы ECMA-262, хотя номера JavaScript фактически являются плавающими. (Технически, плавающие с двойной точностью, дающие вам 52 бит мантиссы, достаточно легко, чтобы охватить диапазон 32-битных int.)

В побитовой арифметике нет проблемы "endianness", и формат байта хранения, в котором может быть задействован endianness, встроен в JavaScript.

Ответ 5

ECMA Script действительно имеет концепцию целочисленного типа, но при необходимости неявно принуждается к или из значения с плавающей запятой с двойной точностью (если представленное число слишком велико или если оно имеет дробную составляющую).

Многие обычные интерпретаторы Javascript (пример SpiderMonkey) используют ярлык в реализации и интерпретируют все числовые значения как двойные, чтобы не проверять фактический собственный тип значения для каждой команды. В результате взлома реализации битовые операции реализуются как приведение к целому типу, за которым следует возврат к двойному представлению. Поэтому не рекомендуется использовать операции на уровне бит в Javascript, и вы все равно не получите повышение производительности.

Ответ 6

JavaScript не имеет целочисленного типа, только тип с плавающей точкой. Вы никогда не сможете приблизиться к деталям реализации, чтобы беспокоиться об этом.