Согласно п 11.4.8 стандарта ECMAScript 5.1:Почему ~ -1 равно 0 и ~ 1 равным -2?
Производство УнарноеВыражение: ~ УнарноеВыражение вычисляется следующим образом:
- Пусть
expr
быть результатом оценки UnaryExpression.- Да
oldValue
beToInt32(GetValue(expr))
.- Возврат результата применения побитового дополнения к
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 включительно. Эти абстрактные операции функционируют как :
- Пусть число будет результатом вызова ToNumber на входном аргументе.
- Если число NaN, +0, -0, + ∞ или -∞, return +0.
- Позвольте posInt be sign (number) * floor (abs (number)).
- Пусть int32bit be posInt modulo 2 ; то есть конечное целочисленное значение k с номером с положительным знаком и менее 2 по величине, такое, что разность posInt и k математически является целым числом, кратным 2 .
- Если int32bit больше или равно 2 , возвращение int32bit - 2 , в противном случае возврата int32bit.
когда аргумент равен -1, в соответствии с 9.5, на шаге 1 число равно будет -1, пропустить step2 на шаге 3 posInt будет -1 на шаге 4 int32bit будет 1 в шаге 5 он вернется 1
какой шаг неправильный?
ToIn32 (-1) -1 должны давать в соответствии с http://www.ecma-international.org/ecma-262/5.1/#sec-9.5 – BartoszKP
Ваше понимание является неправильным и был исправлено в вашем предыдущем вопросе ... (точнее, в моем ответе) – Esailija
Возможный дубликат [что является результатом «x modulo y»?] (http://stackoverflow.com/questions/18256823/what-is- the-result-of-x-modulo-y) – Esailija