Ответ 1
Вы можете попробовать a = arg1>>>0
, но я не уверен, что он сделает то, что вы ищете.
Подробнее см. этот вопрос.
Как набрать литой номер в JavaScript?
a = (unsigned int)atoi(arg1);
b = (unsigned int)atoi(arg2);
Предполагая, что a и b могут быть подписаны.
Я хочу преобразовать 4-байтовое целое число со знаком в 4-байтовое целое число без знака.
Я знаю, что в javascript нет такой вещи, как приведение типа или подпись/без знака. Я ищу простой для понимания алгоритм.
Вы можете попробовать a = arg1>>>0
, но я не уверен, что он сделает то, что вы ищете.
Подробнее см. этот вопрос.
вы также можете использовать
(new Uint32Array([arg1]))[0]
например.
< (new Uint32Array([-1]))[0]
> 4294967295
Объяснение: JavaScript не соответствует традиционным стандартным правилам кастомизации, как C, предпочитает простоту и переносимость типов при низком уровне эффективности. Однако типизированные массивы (Uint8Array и др.) В JavaScript были добавлены специально для эффективной и хорошо определенной операции с несколькими байтами и бит-уровнями. Таким образом, мы можем использовать этот факт для доступа к четко определенным и встроенным операциям литья бит. Синтаксис в приведенном выше примере:
Все (примитивные) числа в Javascript - это удвоения IEEE748, что дает вам 52 бита целочисленной точности.
Проблема с подписанным vs unsigned заключается в том, что все побитовые операторы Javascript, кроме >>>
, преобразуют числа в 32-разрядное число со знаком - то есть они берут наименее значимые 32 бита и выбрасывают остальные, и то полученный бит 31 расшифровывается знаком, чтобы получить подписанный результат.
Если вы начинаете с четырех известных байтовых значений, вы можете обойти проблему с побитовыми операторами, используя вместо этого простые умножения и дополнения, которые используют все 52 бита целочисленной точности, например
var a = [ 1, 2, 3, 4]; // 0x01020304
var unsigned = a[0] * (1 << 24) + a[1] * (1 << 16) + a[2] * (1 << 8) + a[3]