2013-08-15 2 views
4

Согласно п 11.4.8 стандарта ECMAScript 5.1:Почему ~ -1 равно 0 и ~ 1 равным -2?

Производство УнарноеВыражение: ~ УнарноеВыражение вычисляется следующим образом:

  1. Пусть expr быть результатом оценки UnaryExpression.
  2. Да oldValue be ToInt32(GetValue(expr)).
  3. Возврат результата применения побитового дополнения к oldValue. Результатом является подписанное 32-битное целое число.

Оператор ~ будет вызывать внутренний метод ToInt32. В моем понимании ToInt32(1) и ToInt32(-1) вернет то же значение 1, но почему ~-1 равно 0 и ~1 равно -2?

Теперь мой вопрос: почему ToInt32(-1) равно -1? подраздел 9.5 стандарта ECMAScript 5.1:

Абстрактная операция ToInt32 преобразует свой аргумент к одному из 2 целых значений в диапазоне -2 через 2 -1 включительно. Эти абстрактные операции функционируют как :

  1. Пусть число будет результатом вызова ToNumber на входном аргументе.
  2. Если число NaN, +0, -0, + ∞ или -∞, return +0.
  3. Позвольте posInt be sign (number) * floor (abs (number)).
  4. Пусть int32bit be posInt modulo 2 ; то есть конечное целочисленное значение k с номером с положительным знаком и менее 2 по величине, такое, что разность posInt и k математически является целым числом, кратным 2 .
  5. Если int32bit больше или равно 2 , возвращение int32bit - 2 , в противном случае возврата int32bit.

когда аргумент равен -1, в соответствии с 9.5, на шаге 1 число равно будет -1, пропустить step2 на шаге 3 posInt будет -1 на шаге 4 int32bit будет 1 в шаге 5 он вернется 1

какой шаг неправильный?

+1

ToIn32 (-1) -1 должны давать в соответствии с http://www.ecma-international.org/ecma-262/5.1/#sec-9.5 – BartoszKP

+0

Ваше понимание является неправильным и был исправлено в вашем предыдущем вопросе ... (точнее, в моем ответе) – Esailija

+0

Возможный дубликат [что является результатом «x modulo y»?] (http://stackoverflow.com/questions/18256823/what-is- the-result-of-x-modulo-y) – Esailija

ответ

15

-1 в 32-битовое целое число

1111 1111 1111 1111 1111 1111 1111 1111 

Так ~-1 будет

0000 0000 0000 0000 0000 0000 0000 0000 

которая равна нулю.

1 в 32-разрядное целое число

0000 0000 0000 0000 0000 0000 0000 0001 

Так ~1 будет

1111 1111 1111 1111 1111 1111 1111 1110 

Что -2.

Вы должны прочитать о two's complement, чтобы понять отображение отрицательного целого числа в двоичной базе.

+0

Спасибо за то, что вы указали мою ошибку, я просто пропустил ввод этого значения. Он исправлен. –

1

Где у тебя появилась идея, что ToInt32(-1) оценивает на 1? Он оценивает значение -1, которое в 32-битном двоичном представлении двоичного представления - это все биты, установленные в 1. Когда вы применяете оператор ~, каждый бит затем становится 0, что является представлением 0 в 32-битном дополнении двоичный файл.

Представление 1 - это все биты 0, за исключением бит 0. Когда биты инвертированы, результатом являются все биты 1, за исключением бит 0. Это случается как представление дополнения двух до -2. (Чтобы увидеть это, просто вычесть 1 из комплемента представления этих двух в -1.)

0
  • ToInt32(1) возвратит 1
  • ToInt32(-1) возвратит -1
  • -1 представлена ​​в виде подписанного 32-разрядного целого числа, имея все 32 бита установлены. Побитовое дополнение к этому - все биты четкие, поэтому ~-1 дает 0
  • 1 представлен в виде 32-битного целого числа, имеющего все биты, кроме нижнего бита. Побитовое дополнение к этому имеет все биты, за исключением нижнего бита, который является подписанным 32-битовым целочисленным представлением значения -2. Таким образом, ~1 дает -2
Смежные вопросы