«В предыдущей статье мы узнали, как компьютеры хранят числа, а первый бит хранит знаки.
Итак, допустим, мы вычисляем 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
Если вы считаете это полезным, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏, чтобы выразить свою поддержку автору 👇