Арифметика и коды чисел
Прочитайте каждый раздел и сразу выполните небольшое задание в конце. Ответы вводите прямо в поля. После завершения нажмите кнопку «Отправить работу — сохранить PDF».
Как компьютер представляет числа
Человек чаще использует десятичную систему счисления, а цифровая вычислительная техника работает с битами — двумя состояниями, которые условно записывают как 0 и 1.
Например:
13₁₀ = 1101₂ 25₁₀ = 11001₂
Важно: одна и та же последовательность битов может означать разные значения в зависимости от того, как её интерпретировать.
11111111₂ как 8-битное беззнаковое число = 255 как 8-битное знаковое число в дополнительном коде = -1
Переведите число 10₁₀ в двоичную систему.
Двоичное сложение
Двоичные числа складываются по тем же разрядам, что и десятичные, но возможны только цифры 0 и 1.
0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 10 1 + 1 + 1 = 11
Если получается 10₂, в текущем разряде записывается 0, а 1 переносится в следующий разряд.
1011 + 0110 ------- 10001
Проверка: 1011₂ = 11₁₀, 0110₂ = 6₁₀, поэтому результат 10001₂ = 17₁₀.
Выполните сложение: 1010₂ + 0101₂.
Двоичное вычитание
При вычитании действуют простые правила:
0 - 0 = 0 1 - 0 = 1 1 - 1 = 0 10 - 1 = 1
Если в текущем разряде единицы недостаточно, выполняется заём из старшего разряда.
10110 - 00111 ------- 01111
Проверка: 22 - 7 = 15.
В процессоре вычитание часто удобно свести к сложению:
A - B = A + (-B)
Для этого отрицательное число представляют специальным кодом.
Вычислите: 1010₂ − 0011₂.
Двоичное умножение
Умножение выполняется аналогично привычному умножению столбиком.
0 × 0 = 0 0 × 1 = 0 1 × 0 = 0 1 × 1 = 1
Пример:
1011
× 0101
------
1011
0000
1011
0000
-------
110111
1011₂ = 11, 0101₂ = 5, а 110111₂ = 55.
Сдвиг двоичного беззнакового числа влево на один разряд соответствует умножению на 2, если результат помещается в доступную разрядность.
Умножьте: 101₂ × 10₂.
Деление и двоичные сдвиги
Для беззнаковых двоичных чисел сдвиг вправо на один разряд соответствует целочисленному делению на 2.
11010₂ = 26₁₀ 11010 >> 1 = 01101₂ 01101₂ = 13₁₀
При логическом сдвиге вправо освободившиеся старшие разряды заполняются нулями. Для знаковых чисел процессор может использовать арифметический сдвиг, который сохраняет знак числа.
Выполните логический сдвиг вправо на один разряд: 10100₂ >> 1.
Зачем нужны коды отрицательных чисел
Для положительного числа достаточно обычной двоичной записи:
+13 = 00001101
Но память компьютера не хранит отдельный символ «минус». В регистре всё равно находятся только биты. Поэтому нужно правило, по которому определённая комбинация битов будет означать отрицательное число.
При изучении архитектуры ЭВМ рассматривают три варианта:
- прямой код;
- обратный код;
- дополнительный код.
В современных процессорах для знаковых целых чисел основное значение имеет дополнительный код.
Объясните одним-двумя предложениями, зачем компьютеру нужен специальный способ записи отрицательных чисел.
Прямой код
В прямом коде старший бит используется как знак:
0xxxxxxx — положительное число 1xxxxxxx — отрицательное число
Например, в 8-разрядной записи:
+13 = 00001101 -13 = 10001101
Оставшиеся семь битов содержат модуль числа. Недостаток такого способа — два варианта нуля:
00000000 = +0 10000000 = -0
Кроме того, арифметические схемы должны отдельно учитывать знак операндов.
Запишите -5 в 8-битном прямом коде.
Обратный код
Положительные числа записываются как обычно. Для получения отрицательного числа все биты положительного представления инвертируются.
+13 = 00001101
инверсия:
11110010
-13 в обратном коде = 11110010
У обратного кода также существуют два нуля:
00000000 = +0 11111111 = -0
Получите 8-битный обратный код числа -5.
Дополнительный код
Дополнительный код — основной способ представления знаковых целых чисел в современных двоичных вычислительных системах.
Чтобы получить отрицательное число:
- запишите положительное число в нужной разрядности;
- инвертируйте все биты;
- прибавьте 1.
Пример для -13:
+13 00001101 инверсия 11110010 + 1 00000001 ------------------- -13 11110011
Запишите -12 в 8-битном дополнительном коде.
Арифметика в дополнительном коде
Главное преимущество дополнительного кода — положительные и отрицательные числа можно складывать одной и той же двоичной схемой.
Рассмотрим 7 + (-5).
+7 = 00000111 +5 00000101 инверсия 11111010 +1 11111011 -5 11111011 00000111 + 11111011 ---------- 1 00000010
При 8-битной арифметике крайний перенос за пределы разрядной сетки отбрасывается. Остаётся 00000010₂ = 2.
Используя 8-битный дополнительный код, вычислите: 5 + (-3).
Как прочитать отрицательное число в дополнительном коде
Если старший бит знакового числа равен 1, число отрицательное. Чтобы определить его модуль, можно выполнить обратное преобразование: инвертировать биты и прибавить 1.
11111011 инверсия: 00000100 +1: 00000101 = 5 значит: 11111011 = -5
Определите десятичное значение 8-битного числа 11111110 в дополнительном коде.
Диапазон представимых чисел
Количество битов определяет, какие значения можно хранить.
Для беззнакового n-битного числа:
0 ... 2ⁿ - 1
Для знакового числа в дополнительном коде:
-2ⁿ⁻¹ ... 2ⁿ⁻¹ - 1
| Разрядность | Без знака | Со знаком, дополнительный код |
|---|---|---|
| 8 бит | 0 ... 255 | -128 ... 127 |
| 16 бит | 0 ... 65 535 | -32 768 ... 32 767 |
| 32 бита | 0 ... 4 294 967 295 | -2 147 483 648 ... 2 147 483 647 |
Укажите диапазон 4-битного беззнакового числа.
Арифметическое переполнение
Разрядность регистра ограничена. Если математический результат нельзя представить в заданном количестве битов, возникает переполнение.
В 8-битном дополнительном коде максимальное положительное число — 127:
01111111 = 127 01111111 + 00000001 ---------- 10000000
Но 10000000 в 8-битном дополнительном коде означает -128. Математический результат 128 не помещается в диапазон -128 ... 127.
Будет ли переполнение при сложении двух 8-битных знаковых чисел: 100 + 20?
Перенос и переполнение — разные события
При беззнаковой арифметике важен перенос из старшего разряда. Например:
11111111 + 00000001 ---------- 1 00000000
В 8 битах останется 00000000, а единица окажется за пределами регистра. Это перенос.
Для знаковой арифметики в дополнительном коде отдельно отслеживается переполнение — ситуация, когда знаковый математический результат не помещается в заданную разрядность.
Какой флаг в x86 связан со знаковым переполнением: CF или OF?
Расширение знака
Иногда число нужно перенести из регистра меньшей разрядности в регистр большей разрядности.
Для положительного числа старшие разряды заполняются нулями:
8 бит: 00000101 16 бит: 00000000 00000101
Для отрицательного числа в дополнительном коде копируется знаковый бит:
-5, 8 бит: 11111011 -5, 16 бит: 11111111 11111011
Так сохраняется числовое значение.
Расширьте 8-битное число 11111110 до 16 бит с сохранением знака.
Двоично-десятичный код BCD
В BCD каждая десятичная цифра кодируется отдельно четырьмя битами.
5 → 0101 9 → 1001 59 в BCD: 0101 1001
Это не то же самое, что обычная двоичная запись числа 59:
59₁₀ = 00111011₂ 59 в BCD = 0101 1001
BCD удобен там, где важно работать именно с десятичными цифрами.
Запишите число 42 в BCD.
Целые и вещественные числа
Целые числа могут интерпретироваться как беззнаковые или знаковые. Для знаковых целых чисел широко используется дополнительный код.
Но дробные и очень большие или очень маленькие значения удобно представлять с плавающей точкой. В распространённом двоичном формате число разбивается на части:
- знак;
- порядок;
- значащая часть.
Например, стандарт IEEE 754 описывает форматы двоичной арифметики с плавающей точкой. Подробное устройство таких чисел рассматривается отдельно в теме о формах представления чисел в ЭВМ.
Что лучше подходит для хранения значения 3,14159: целое число или число с плавающей точкой?
АЛУ и флаги результата
Арифметико-логическое устройство (АЛУ) процессора выполняет арифметические и логические операции над двоичными операндами.
5 = 00000101
3 = 00000011
00000101 + 00000011
↓
00001000
↓
8
После операции процессор может изменить флаги состояния. В x86 среди них:
- CF — перенос/заём;
- ZF — результат равен нулю;
- SF — знак результата;
- OF — знаковое переполнение.
Эти признаки позволяют следующим машинным инструкциям анализировать результат вычисления.
Какой флаг устанавливается, если результат арифметической операции равен нулю?
Перед сдачей
После нажатия кнопки откроется окно печати. Выберите «Сохранить как PDF». В PDF попадут все ваши ответы полностью.