«В предыдущей статье мы узнали, как компьютеры хранят числа, а первый бит хранит знаки.

Итак, допустим, мы вычисляем 3 и -3. Если вы представите 3 и -3 в виде двоичных чисел, это будет выглядеть следующим образом:

+3 => 00000011
-3 => 10000011

Так как здесь используется оператор &(И), результатом будет 00000011, то есть вы ожидали получить 3?

Если вы запустите 3 и -3 в реальном Node.js REPL, результат будет 1.

Что? Что случилось?

Подписанная величина

Во-первых, метод выражения знака с помощью 1 верхнего бита и абсолютного значения целого числа с помощью оставшихся битов называется Величина со знаком.

При выражении отрицательных чисел на компьютере не используется величина со знаком.

Он интуитивно понятен с точки зрения человека, но есть проблема в том, что при расчетах выходят неправильные результаты.

Например, если вы решаете 3 + (-3) с величиной со знаком, вы получаете -6, что является совершенно другим значением, чем правильный ответ 0, как показано ниже:

+3 => 00000011
-3 => 10000011 +
— — — — — — — — — —
10000110 => -6

Таким образом, компьютеры не используют величину со знаком при выражении отрицательных чисел.

Величина со знаком — это один из способов, с помощью которых компьютеры выражают отрицательные числа. Один из способов означает, что есть и другие пути, верно?

Другими способами являются дополнение 1 и дополнение 2.

Дополнение

Комплемент означает количество дополнений. Чтобы понять дополнение, мы должны взглянуть на систему счисления.

В системе счисления N (десятичная система, двоичная система и т. д.) есть дополнение N и дополнение N-1.

дополнение N

Определение дополнения N:

Если к любому числу a добавить b и получить число N в системе счисления, то b называется дополнением N числа a.

For examples, if 1 + b = 10, then b(=9) is 10’s complement of 1

Дополнение N-1

Определение дополнения N-1:

Если вы добавите b к любому числу a и получится [число N в системе счисления-1], то b называется дополнением a к N-1.

For examples, if 1 + b = 9(10–1), then b(=8) is 9’s complement of 1

Другими словами, дополнение N равно дополнению N-1 + 1.

Теперь, когда мы знаем о дополнении, давайте посмотрим, что такое дополнение 1.

1 дополнение

Дополнение до 1 равно выражению отрицательного числа путем инвертирования всех битов этого положительного числа.

Например, если 3 выразить как двоичное число с использованием дополнения до 1, будут получены следующие результаты:

+3 => 00000011 => 1의 보수 법 적용 => 11111100 => -3

Используя дополнение до 1, мы получаем результат 3 + (-3) равно 0, что является правильным ответом.

Значит, все проблемы решены? К сожалению, нет.

Дополнение до 1 решает вычислительную проблему в величине знака, но есть проблема, заключающаяся в том, что есть два значения, представляющие 0 (как в величине со знаком).

+0 => 00000000
-0 => 11111111

Кроме того, была проблема, что при добавлении возникал end-ear-carry.

конец-вокруг-нести

End-round-carry означает ситуацию, в которой результат -0 + 1 равен +0, поэтому вам нужно добавить еще 1, чтобы получить правильное значение.

1110 => -1
1111 => -0
0000 => 0

Проблема не была решена величиной со знаком и дополнением до 1, поэтому получилось дополнение до 2.

Компьютер использует это дополнение до 2 для выражения отрицательного числа.

дополнение 2

Дополнение до 2 выражает отрицательное число добавлением 1 к дополнению до 1.

Например, результат 3 с дополнением до 2:

Use 1’s complement -3 => 11111100
Adding 1 to 1’s complement 11111100 + 1 => 11111101
The result -3 => 11111101

Выводы

Компьютер использует дополнение до 2, когда выражает отрицательное число. Таким образом, результат 3 и -3 равен 1.

+3 => 00000011
-3 => 11111101
3 & (-3) => 00000001 => 1

Если вы считаете это полезным, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏, чтобы выразить свою поддержку автору 👇

🚀Присоединяйтесь к FAUN и получайте похожие истории в свой почтовый ящик каждую неделю