Отрицательные числа представлены в виде дополнения до двух , то есть двоичное представление -100
равно
(2**32 - 100).toString(2) = 11111111111111111111111110011100
, добавление 0xff
дает 10011100
, что156
.
Операция модуля %
определяется как
IF a % b == r THEN a == b * q + r for some q
Всегда есть два варианта для q
и r
с положительным и отрицательным остатком. Например, с 7 % 3
,
7 = 3 * 2 + 1
7 = 3 * 3 - 2
То же самое для отрицательных чисел, -7 % 3
:
-7 = 3 * (-2) - 1
-7 = 3 * (-3) + 2
Для положительных чисел все языки выбирают положительный остаток. Для отрицательных чисел выбор отличается от языка к языку. например, в python остаток всегда положительный, поэтому
-7 % 3 = 2 # python
Javascript выбирает отрицательный остаток, поэтому в JS
-7 % 3 = -1 // javascript
Аналогично, для -100 % 256
-100 = 256 * ( 0) - 100
-100 = 256 * (-1) + 156
В python остаток будет 156
(и, следовательно, будет соответствовать & FF
), в javascript это -100
.