На Горох
Информатика, 8 класс

§ 10. Сложение целых чисел в памяти компьютера

"Информатика (в 2-х частях)", Горячев А.В., Герасимова В.Г., Макарина Л.А., Островский С.Л., Паволоцкий А.В., Семёнов А.А., Юдина А.Г., Чернышёва Т.Л.

Объяснение темы В оглавлении: § 10. Сложение целых чисел в памяти компьютера

Кратко о теме

Компьютер складывает целые числа, записанные в двоичном виде и размещённые в ячейках фиксированной длины. Для положительных чисел старший разряд служит знаком, а отрицательные хранятся в дополнительном коде. Благодаря этому сложение чисел с разными знаками выполняется теми же двоичными правилами, что и сложение положительных. Но разрядов всегда конечное число: если результат не помещается в отведённую сетку, возникает переполнение. На примерах разберём, как записывать числа, складывать их коды и проверять результат.

Объяснение темы

Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.

Определения и обозначения

Разрядная сетка — фиксированное число ячеек памяти, в которых размещаются все разряды целого числа. Например, в 8-разрядной сетке всегда записывают восемь битов, даже если число занимает меньше места. Ограничение нужно потому, что компьютер выделяет числу определённое количество памяти.

Знаковый разряд — старший разряд, по которому определяется знак числа в двоичном представлении. В рассматриваемой записи 0 означает неотрицательное число, а 1 — отрицательное. Этот разряд помогает различать знак, не добавляя к двоичной записи отдельный символ минуса.

Дополнительный код — способ представления отрицательного целого числа, позволяющий складывать положительные и отрицательные числа одним алгоритмом. Его получают инвертированием разрядов модуля числа и прибавлением единицы. Такой способ нужен, чтобы процессор мог выполнять сложение по общим двоичным правилам.

Переполнение — ситуация, при которой результат вычисления не помещается в отведённое число разрядов. Например, сумма может оказаться больше наибольшего числа, которое представимо в данной сетке. Термин нужен, чтобы отличать верный результат от кода, который из-за ограничения разрядов означает другое число.

Как это устроено

Компьютер хранит числа в двоичном виде, потому что электронным элементам удобно различать два устойчивых состояния: условные 0 и 1. Но число разрядов в ячейке памяти ограничено её размером, поэтому нельзя записать целое число сколь угодно длинной двоичной записью. Одна и та же длина сетки позволяет однозначно отделять знак и выполнять операции по общим правилам.

Положительное число сначала переводят из десятичной системы в двоичную, затем записывают в сетке так, чтобы старший разряд был равен 0. Если двоичных цифр не хватает, свободные места слева заполняют нулями: например, 13 в восьми разрядах — 00001101. Нулевой старший разряд оставляет место для обозначения знака, а дополнение до общей длины делает записи чисел одинаковыми.

Чтобы записать отрицательное число, сначала берут его модуль и представляют его в той же сетке. Затем каждый 0 заменяют на 1, а каждый 1 — на 0, после чего прибавляют единицу. Так получают дополнительный код: например, для −3 запись модуля 00000011 после инверсии становится 11111100, а после прибавления единицы — 11111101. Эта процедура нужна, чтобы отрицательное число участвовало в сложении как набор битов, а не как отдельная запись со знаком минус.

Полученные коды складывают обычным двоичным сложением справа налево, передавая перенос в следующий разряд. Если в столбце сумма равна 2 или 3, в текущем разряде записывают соответственно 0 или 1, а перенос добавляют к следующему столбцу. Дополнительный код устроен так, что эта арифметика даёт код суммы и при сложении чисел с разными знаками.

За пределами сетки дополнительного разряда нет, поэтому перенос из самого старшего разряда отбрасывают. Однако это не значит, что любой такой перенос указывает на ошибку: переполнение проверяют по знакам. При сложении разных знаков результат остаётся в диапазоне, а при сложении двух положительных или двух отрицательных чисел противоположный знак результата показывает, что истинная сумма не поместилась.

Представление целых чисел и результаты сложения в разрядной сетке

В таблице собраны правила записи чисел и проверки результата; в каждом примере нужно сохранять одну и ту же длину сетки. Сначала определите, как представлены слагаемые, затем выполните сложение и проверьте знак результата. Не делайте вывод о переполнении только по наличию переноса из старшего разряда.

СитуацияЧто происходит с разрядамиЧто означает результат
Положительное числоСтарший разряд равен 0, остальные содержат двоичную запись числаЧисло представлено корректно
Отрицательное числоПолучается дополнительный код: инверсия разрядов модуля числа и прибавление единицыСтарший разряд равен 1
Сложение чисел разных знаковВыполняется обычное двоичное сложение с переносамиПереполнение невозможно
Сложение чисел одного знакаРезультат проверяется по знаковому разрядуПри изменении знака результата возникает переполнение
Перенос за пределы разрядной сеткиСтарший перенос отбрасываетсяСам по себе перенос не означает переполнение

Разбор задач

Сложить 13 и 6 в 8-разрядной сетке

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

  1. Переводим числа в двоичную систему и дополняем слева нулями: 13 = 00001101, 6 = 00000110.
  2. Складываем справа налево: 00001101 + 00000110 = 00010011. Переносы учитываются в следующем разряде.
  3. Проверяем знак: старший разряд результата равен 0, значит код представляет положительное число.
  4. Для проверки переводим 00010011 в десятичную систему: 16 + 2 + 1 = 19.

Ответ: 00010011₂ = 19₁₀. Результат совпадает с обычным сложением 13 + 6.

Сложить 7 и −3 в 8-разрядной сетке

Слагаемые имеют разные знаки, поэтому отрицательное число нужно представить дополнительным кодом. После сложения полезно перевести итоговый код обратно в десятичное число: так можно проверить, что он означает ожидаемую разность. Не забудем оставить всем записям восемь разрядов.

  1. Записываем 7: 00000111. Для числа 3 модуль в сетке — 00000011.
  2. Инвертируем разряды модуля: 11111100, затем прибавляем единицу: код −3 равен 11111101.
  3. Складываем: 00000111 + 11111101 = 1 00000100. Перенос за границу восьмиразрядной сетки отбрасываем, остаётся 00000100.
  4. Код результата начинается с 0, значит он положительный; 00000100₂ = 4₁₀.

Ответ: 00000100₂ = 4₁₀. Значит, 7 + (−3) = 4.

Сложить 100 и 60 и проверить переполнение

Оба слагаемых положительные, а значит, если переполнения нет, у результата должен остаться нулевой знаковый разряд. В восьмиразрядном дополнительном коде наибольшее положительное число равно 127. Поэтому ещё до вычисления можно предположить, что сумма 160 в этой сетке не представима.

  1. Записываем коды с нулевым старшим разрядом: 100 = 01100100, 60 = 00111100.
  2. Складываем: 01100100 + 00111100 = 10100000. Переноса за пределы сетки нет.
  3. Смотрим на знаковый разряд: у обоих слагаемых он равен 0, а у результата — 1. Знак изменился, значит произошло переполнение.

Ответ: код суммы в сетке — 10100000, но верно представить им число 160 нельзя. Истинный результат больше верхней границы 127.

Типичные ошибки

Записывают отрицательное число как двоичную запись модуля со знаком минус, например −3 как −00000011. Так делают по привычке к десятичной записи, но процессор использует для отрицательного числа дополнительный код. Проверьте себя: код отрицательного числа в сетке не содержит отдельного символа минуса, а его старший разряд равен 1.

После инвертирования разрядов забывают прибавить единицу. Причина — две операции легко воспринимаются как один шаг, хотя без прибавления получится не дополнительный код. Проверьте вычисление на простом числе: для −3 после инверсии 00000011 получается 11111100, а правильный код — 11111101.

Любой перенос из старшего разряда принимают за переполнение. Перенос отбрасывают из-за фиксированной длины сетки, но он может появиться и при правильном результате, например при сложении 7 и −3. Проверяйте именно знаки: переполнение при сложении чисел одного знака видно, если знак результата стал противоположным.

Для слагаемых используют разное число разрядов или теряют ведущий знаковый разряд. Это случается, когда записывают двоичные числа отдельно, не приводя их к длине сетки. Перед сложением дополняйте положительные числа слева нулями и пересчитывайте количество битов: в данном примере в каждой строке должно быть ровно восемь.

Связь с другими темами

Для работы с дополнительным кодом понадобятся позиционная запись чисел, перевод из десятичной системы в двоичную и обратно, а также правила двоичного сложения. Эти знания объясняют, как процессор выполняет арифметические операции и как знаковые числа хранятся в оперативной памяти. Дальше тот же способ записи пригодится при изучении вычитания, диапазона представимых чисел и компьютерной арифметики.

Что запомнить

  • Число хранится в фиксированной разрядной сетке.
  • Старший разряд используется для обозначения знака.
  • Отрицательные числа представляются в дополнительном коде.
  • Дополнительный код получают инвертированием разрядов модуля и прибавлением единицы.
  • Коды чисел складываются обычным двоичным сложением.
  • Перенос за пределы разрядной сетки отбрасывается.
  • Переполнение возникает, когда истинный результат не помещается в заданное число разрядов.

Частые вопросы по теме

Зачем компьютеру дополнительный код отрицательных чисел?

Дополнительный код позволяет складывать положительные и отрицательные числа одним алгоритмом двоичного сложения. Процессору не нужно отдельно выполнять сложение и вычитание в зависимости от знаков.

Почему при сложении отбрасывают перенос из старшего разряда?

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

Как быстро получить дополнительный код отрицательного числа?

Запишите модуль числа в нужном числе разрядов, инвертируйте каждый разряд и прибавьте единицу. Например, для −3 в 8 разрядах: 00000011 → 11111100 → 11111101.

Всегда ли перенос из знакового разряда означает переполнение?

Нет. Перенос за границу сетки может появиться и без переполнения, поэтому его отбрасывают. Переполнение возникает при сложении чисел одного знака, если знак результата стал противоположным.

Как определить диапазон целых чисел для заданного количества разрядов?

Для n-разрядного дополнительного кода диапазон равен от −2ⁿ⁻¹ до 2ⁿ⁻¹ − 1. Например, в 8 разрядах можно представить числа от −128 до 127.

Спросить по теме параграфа

§ 10. Сложение целых чисел в памяти компьютера

Эта же тема в других учебниках

Учебник

Оглавление →
Предмет
Информатика
Класс
8 класс
Учебник
"Информатика (в 2-х частях)", Горячев А.В., Герасимова В.Г., Макарина Л.А., Островский С.Л., Паволоцкий А.В., Семёнов А.А., Юдина А.Г., Чернышёва Т.Л.