ДС: Почему ~10 (двоичное, ~1010) = -11 (двоичное, -1011)?

В Javascript, если я выполняю побитовую операцию НЕ над десятичным целым числом 10:

~10

Я ожидаю, что он будет вычислять побитовое НЕ для двоичного целого числа следующим образом:

~1010 = 0101

Другими словами, я ожидал получить десятичное целое число 5. Вместо этого операция дает мне -11. (попробуйте в консоли)

~10 = -11

Если я проверю это более явно, просмотрев -11 и ~10 как двоичные целые строки:

parseInt(~10,10).toString(2)
"-1011"

parseInt(-11,10).toString(2)
"-1011"

Последовательный. Но я не понимаю. Может ли кто-нибудь объяснить мне, почему? Я предполагаю, что это как-то связано со знаком.

РЕДАКТИРОВАТЬ: Я нашел этот вопрос после публикации, это также помогло мне лучше понять это явление.


person msolters    schedule 01.08.2014    source источник


Ответы (1)


Побитовые операторы в Javascript обрабатывают число как 32-битное. Итак, 10

00000000 00000000 00000000 00001010

Когда вы инвертируете его, результат будет следующим:

11111111 11111111 11111111 11110101

При интерпретации как 32-битное число со знаком это -11 (если вы не понимаете, почему, прочитайте статью в Википедии на Дополнение до двух).

person Barmar    schedule 01.08.2014
comment
Да я понимаю теперь! Спасибо. - person msolters; 01.08.2014