JavaScript Endian Encoding? - PullRequest
       18

JavaScript Endian Encoding?

11 голосов
/ 02 февраля 2009

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

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

Ответы [ 6 ]

31 голосов
/ 02 февраля 2009

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

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

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

12 голосов
/ 06 декабря 2012

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

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 вместо этого, если ваша машина имеет байтовый порядок.

6 голосов
/ 02 февраля 2009

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

4 голосов
/ 02 февраля 2009

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

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

3 голосов
/ 02 февраля 2009

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

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

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

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

0 голосов
/ 02 февраля 2009

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

...