Арифметические операции в различных системах счисления

Иван Корнев·07.05.2026·5 мин

Арифметические операции в позиционных системах счисления выполняются по тем же принципам, что и в привычной десятичной, но с учетом основания системы ($N$). При сложении перенос в старший разряд происходит, когда сумма цифр достигает $N$. При вычитании единица занимает из старшего разряда равна $N$ единиц младшего. Умножение реализуется через последовательное сложение частичных произведений со сдвигом. Понимание этих правил критически важно для программирования, работы с сетевыми протоколами и компьютерной архитектурой.

Ключевое правило: Во всех позиционных системах алгоритм действий идентичен десятичному. Меняется только «порог» переноса или заимствования, который равен основанию системы счисления.

Если статья длиннее 3000 знаков, автоматически добавь перед первым H2:

Оглавление

  1. Базовые принципы
  2. Сложение в разных системах
  3. Вычитание и метод дополнения
  4. Умножение столбиком
  5. Частые ошибки
  6. FAQ

Базовые принципы

В позиционной системе счисления с основанием $N$ используются цифры от $0$ до $N-1$. Вес цифры зависит от её позиции (разряда) и рассчитывается как $N^k$, где $k$ — номер разряда (начиная с 0 справа налево).

При выполнении арифметических действий необходимо помнить:

  • Перенос (Carry): Если результат операции в текущем разряде $\ge N$, то избыток делится на $N$. Целая часть идет в следующий разряд, остаток остается в текущем.
  • Заимствование (Borrow): Если уменьшаемое меньше вычитаемого в текущем разряде, мы занимаем единицу из старшего разряда. Эта единица равна $N$ в текущем разряде.

Сложение в разных системах

Алгоритм сложения одинаков для любой системы: складываем цифры разрядов справа налево, учитывая перенос из предыдущего шага.

Двоичная система (основание 2)

Используются цифры 0 и 1. Правила сложения одноразрядных чисел:

  • $0 + 0 = 0$
  • $0 + 1 = 1$
  • $1 + 0 = 1$
  • $1 + 1 = 10_2$ (0 пишем, 1 в перенос)
  • $1 + 1 + 1 = 11_2$ (1 пишем, 1 в перенос)

Пример: $1011_2 + 1101_2$

  1011
+ 1101
------
 11000

Разбор:

  1. $1+1=10$ → пишем 0, перенос 1.
  2. $1+0+1(\text{перенос})=10$ → пишем 0, перенос 1.
  3. $0+1+1(\text{перенос})=10$ → пишем 0, перенос 1.
  4. $1+1+1(\text{перенос})=11$ → пишем 11. Результат: $11000_2$ (что равно $24_{10}$).

Шестнадцатеричная система (основание 16)

Используются цифры $0-9$ и буквы $A-F$ ($A=10, B=11, ..., F=15$). Перенос возникает, если сумма $\ge 16$.

Пример: $A3_{16} + 1F_{16}$

  1. Младший разряд: $3 + F (15) = 18$. $18 / 16 = 1$ (остаток 2). Пишем 2, перенос 1.
  2. Старший разряд: $A (10) + 1 + 1 (\text{перенос}) = 12$. $12$ в hex — это C. Результат: $C2_{16}$.

Для быстрого сложения в hex можно переводить цифры в десятичные в уме, выполнять операцию, а результат возвращать в hex. Например, $D (13) + 5 = 18 \rightarrow 12_{16}$.

Вычитание и метод дополнения

Классическое вычитание столбиком

При нехватке единиц в разряде занимаем у старшего. Занятая единица превращается в $N$ единиц текущего разряда.

Пример в восьмеричной системе (основание 8): $52_8 - 17_8$

  1. Младший разряд: $2 - 7$ нельзя. Занимаем у 5. $2 + 8 = 10$. Теперь $10 - 7 = 3$. В старшем разряде было 5, стало 4.
  2. Старший разряд: $4 - 1 = 3$. Результат: $33_8$.

Вычитание через дополнение (для компьютеров)

В цифровой технике вычитание часто заменяют сложением с использованием дополнительного кода (Two's Complement). Это позволяет использовать один и тот же сумматор для обеих операций. Алгоритм для вычисления $A - B$:

  1. Инвертировать все биты числа $B$.
  2. Прибавить 1 к результату инверсии.
  3. Сложить полученное число с $A$.
  4. Отбросить перенос из старшего разряда (если он есть).

Умножение столбиком

Умножение сводится к умножению каждого разряда множителя на множимое, сдвигу результатов влево и их последующему сложению.

Двоичное умножение

Это самый простой вид умножения, так как таблица умножения тривиальна:

  • $0 \cdot 0 = 0$
  • $0 \cdot 1 = 0$
  • $1 \cdot 0 = 0$
  • $1 \cdot 1 = 1$

Фактически, умножение на 1 означает копирование множимого, а на 0 — запись нулей. Результаты суммируются со сдвигом.

Пример: $101_2 \times 11_2$ ($5 \times 3 = 15$)

    101
  x  11
  -----
    101  (101 * 1)
   1010  (101 * 1, сдвиг на 1 разряд влево)
  -----
   1111

Результат $1111_2$ равен $15_{10}$.

Особенности умножения в больших основаниях

В системах с основанием больше 10 (например, 16) удобно пользоваться переводом в десятичную систему для промежуточных вычислений, если нет готовой таблицы умножения.

Пример: $2_{16} \times A_{16}$ Переводим: $2 \times 10 = 20$. Переводим обратно в hex: $20 = 1 \cdot 16 + 4 \rightarrow 14_{16}$.

Частые ошибки

  1. Забывать про основание при переносе. Самая распространенная ошибка — переносить единицу, когда сумма равна 10, даже в двоичной или восьмеричной системе. В двоичной перенос нужен уже при сумме 2.
  2. Неправильное заимствование. При вычитании в восьмеричной системе занятая единица дает 8, а не 10. В шестнадцатеричной — 16.
  3. Путаница с буквами в Hex. Ошибки возникают при сложении букв (например, $A+A$). Рекомендуется всегда делать быструю прикидку в десятичной системе: $10+10=20$, $20-16=4$, перенос 1. Итог: $14_{16}$.
  4. Потеря сдвига при умножении. При сложении частичных произведений важно правильно выравнивать разряды. Каждый следующий частичный продукт сдвигается на одну позицию влево.

FAQ

В чем разница между переносом и заимствованием? Перенос используется при сложении и умножении, когда значение в разряде превышает основание системы. Заимствование используется при вычитании, когда значение уменьшаемого меньше вычитаемого.

Можно ли делить в столбик в двоичной системе? Да, алгоритм деления уголком аналогичен десятичному. Однако в двоичной системе на каждом шаге нужно лишь определить, помещается ли делитель в текущую часть делимого (ответ либо 0, либо 1), что делает процесс очень формализованным.

Почему в компьютерах используют дополнительный код для вычитания? Это упрощает архитектуру процессора. Вместо создания отдельного блока для вычитания, используется тот же блок сложения (ALU), что экономит транзисторы и повышает быстродействие.

Как быстро проверить правильность расчетов в другой системе? Переведите исходные числа в десятичную систему, выполните операцию там и переведите результат обратно в исходную систему. Если значения совпадают, расчет верен.