14.07.2012, 13:24
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
не то чтобы доказательство, но может прояснит немного картину: - Переполнение. Целочисленные переменные (в javascript такие "возникают" во время побитовых операций) имеют фиксированный размер. Если прибавить очень большое число, непоместившиеся биты "обрежуться", в частности (правила по аналогии с десятичной системой):
Код:
|
0101b
+
10000b
------
0101b |
- Дополнительный код (дополнение до двух) - распространенный формат, в котором хранятся отрицательные числа. Половина значений отводятся под положительные числа, половина - под отрицательные:
Код:
|
1000b (-8) .. 1111b (-1), 0000b, 0001b (1) .. 0111b (7) |
Соответственно, чтобы получить отрицательное число, надо вычесть модуль из нуля, или, что то же самое, из 10000b (16) (в случае 4-битных чисел, в общем случае из 2^N, где N - количество битов):
Код:
|
10000b
-
0010b
-------
1110b |
- Дополнение до единицы - еще один формат, нераспространенный. Модуль числа получается с помощью операции NOT, например:
Код:
|
~0001b = 1110b
~0010b = 1101b |
т.е. получается следующая картина:
Код:
|
1000b (-7) .. 1110b (-1), 1111b (-0), 0000b, 0001b (1) .. 0111b (7) |
и 1) отрицательные числа как бы смещены на один влево, 2) на образовавшемся месте появился отрицательный ноль
- ~a = 1111b - a (хз, почему так получается), 1111b = (10000b - 1) ("разница" между форматами равна единице)
Код:
|
1111b
-
0001b
-----
1110b |
|