2013-02-15 1 views
7

как набирать число в javascript?Тип стиля JavaScript Тип Отправлено от подписываемого до неподписанного

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

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

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

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

+0

Вам не нужно включать его в Javascript. Вы можете просто использовать его как int. Хотя это был изначально текст. –

+0

У JavaScript нет подписных и беззнаковых целых чисел. У этого есть только эти основные типы -> текст, число, логическое, объект, функция. – Undefined

+0

Я хочу конвертировать из подписанного в unsigned. – Matthias

ответ

20

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

Для получения более подробной информации см. this question.

+1

Я действительно искал это. – Matthias

+2

var arg1 = -1; var a = arg1 >>> 0 предупреждение (a); – Matthias

+0

Большое спасибо за это решение. Из этого подхода я смог более эффективно решить http://stackoverflow.com/questions/28519708/javascript-bitwise-masking. – ptdecker

1

Все (примитивные) номера в Javascript - это удвоения IEEE748, что дает вам 52 бита целочисленной точности.

Проблема с подписанными против знака является то, что все операторы 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] 
7

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

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

например

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

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

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

Похож на волшебство. Не могли бы вы объяснить, как это работает? – Matthias

+1

Это правильный ответ, никаких вопросов. О волшебной части. Данные на компьютерах представлены в битах, а один байт - 8 бит. Чтобы создать отрицательный номер, вы устанавливаете последний бит в 1. . У вас осталось 7 бит для хранения вашего номера (7 бит для сохранения значения плюс, если вы установите последний бит в 0 или 7 бит, чтобы представить отрицательный номер, если вы установите последний бит в 1). Значит, нет волшебства, вы просто говорите компилятору, как понимать значение. Вы можете, например, относиться к положительному числу как к отрицательному, если вы говорите, красное это как подписанное число. (U обозначает unsigned в Uint32) –

+0

С опозданием добавлено объяснение. – joth

Смежные вопросы