Тип стиля JavaScript C От подписаны до неподписанных

Как набрать литой номер в JavaScript?

a = (unsigned int)atoi(arg1);
b = (unsigned int)atoi(arg2);

Предполагая, что a и b могут быть подписаны.

Я хочу преобразовать 4-байтовое целое число со знаком в 4-байтовое целое число без знака.

Я знаю, что в javascript нет такой вещи, как приведение типа или подпись/без знака. Я ищу простой для понимания алгоритм.

Ответ 1

Вы можете попробовать a = arg1>>>0, но я не уверен, что он сделает то, что вы ищете.

Подробнее см. этот вопрос.

Ответ 2

вы также можете использовать

(new Uint32Array([arg1]))[0]

например.

< (new Uint32Array([-1]))[0]
> 4294967295

Объяснение: JavaScript не соответствует традиционным стандартным правилам кастомизации, как C, предпочитает простоту и переносимость типов при низком уровне эффективности. Однако типизированные массивы (Uint8Array и др.) В JavaScript были добавлены специально для эффективной и хорошо определенной операции с несколькими байтами и бит-уровнями. Таким образом, мы можем использовать этот факт для доступа к четко определенным и встроенным операциям литья бит. Синтаксис в приведенном выше примере:

  • Создает массив натурального числа ввода
  • Создает типизированный массив (Uint32Array) из этого числа. Это будет происходить.
  • Извлекает первый (0-й) элемент этого типизированного массива, который содержит результат литья.

Ответ 3

Все (примитивные) числа в 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]