Число 4 не 100
.Это 00000000000000000000000000000100
.Все эти нули переворачиваются на единицы на ~
.
Полученное число отрицательно из-за того, как эти 32-битные значения интерпретируются при преобразовании обратно в обычные числа JavaScript.Но я забегаю вперед: первое, что делает битовый оператор в JavaScript, это создает временное 32-битное целочисленное значение из номера источника.Затем оператор делает свое дело, что в случае ~
- инвертировать все биты этого 32-битного значения.Затем число преобразуется обратно в 64-битное значение с плавающей запятой двойной точности, которое является обычным числовым типом JavaScript.
32-битные значения интерпретируются как знаковые значения, которыеимеет отношение к тому, как работает компьютерная арифметика.Достаточно сказать, что любое 32-разрядное значение, у которого самый левый (самый значимый) бит равен 1
, интерпретируется как отрицательное значение.
Двоичная математика и способ современных компьютеров (ну, почти все исторические)тоже) сделать это вроде - широкий предмет.Некоторые языки программирования предоставляют абстракции, которые в основном скрывают реальность работы вычислительного оборудования на самом деле ;JavaScript на самом деле не является одним из этих языков в большинстве реализаций.