П.2 Кодирование и обработка на компьютере целых чисел без знака
Способы кодирования целых чисел различаются для двух видов этих чисел:
- Целых положительных чисел (без знака),
- Целых чисел со знаком.
Рассмотрим сначала кодирование целых чисел без знака.
7210=10010002
В однобайтовом формате представление этого числа:
Номера разрядов | ||||||||
Содержимое разрядов |
В двухбайтовом формате представление числа:
Номера разрядов | ||||||||||||||||
Содержимое разрядов |
Комбинация связанных соседних ячеек, обрабатываемая совместно, называется машинным словом.
Понятие наибольшего и наименьшего целого числа без знака:
Zmax=11111111111111112=6553510
Если требуется большее число, надо переходить к ному числу для данного языка программирования.
Zmin=00000000000000002=010
Названия и параметры беззнаковых целых переменных в разных языках программирования
Формат числа (в байтах) | Диапазон | Названия типов в языках программирования | |||
Запись с порядком | Обычная запись | Pascal | C++ | Java | |
0…..28-1 | 0 255 | byte | |||
0…..216-1 | 0……65535 | word |
Рекомендация к программированию: Однобайтовые целые беззнаковые переменные логичнее всего использовать в качестве индекса массива. |
Арифметические операции, не меняющие типа целых беззнаковых переменных:
1. Сложение:
02 + 02 = 02 | 02 + 12 = 12 | 12 + 02 = 12 | 12 + 12 = 102 |
В последнем примере 12 + 12 = 102 возникает необходимость поместить куда-то старший разряд. Место, куда переносится цифра старшего разряда, называется битом переноса или регистром переноса (переполнения).
Пример: 6553410 + 310
Регистр переноса | Разряды (регистры, ячейки) | ||||||||||||||||
Первое слагаемое | |||||||||||||||||
Второе слагаемое | |||||||||||||||||
Сумма |
Регистр переноса (переполнения) получил значение равное ЕДИНИЦА – это ошибка вычислений. В языках программирования это вызывает останов вычислений. В некоторых программах (Excel, MathCad) в этом случае переменная автоматически преобразуется в вещественный тип.
2. Умножение:
02 * 02 = 02 | 02 * 12 = 02 | 12 * 02 = 02 | 12 + 12 = 12 |
Пример: 1510 * 510 = 7510 = 1000012
Разряды | ||||||
Первое слагаемое | ||||||
Второе слагаемое | ||||||
Умножаем «в столбик» | ||||||
Сумма |
Из примера видно, что умножение целых чисел без знака сводится к сдвигам первого слагаемого → специальную операцию умножения в ЭВМ вводить нет необходимости.
П.3 Кодирование и обработка на компьютере целых чисел со знаком: прямой, обратный и дополнительный коды
Напомним, что способы кодирования целых чисел различаются для двух видов этих чисел:
- Целых положительных чисел (без знака),
- Целых чисел со знаком.
Рассмотрим сначала кодирование целых чисел со знаком.
П.3-1 Прямой n-разрядный двоичный код представления целых чисел со знаком.
Один разряд (обычно самый старший) отводится для хранения информации о знаке, остальные n-1 разряды – для хранения значащих цифр.
Для положительных чисел в знаковый разряд помещают 0.
Для отрицательных чисел в знаковый разряд помещают 1.
Примеры для 8-разрядных машинных слов:
а). 110=12
Знаковый разряд | Разряды значащих цифр | ||||||
б). 12710=11111112
Знаковый разряд | Разряды значащих цифр | ||||||
в). -110
Знаковый разряд | Разряды значащих цифр | ||||||
в). -12710
Знаковый разряд | Разряды значащих цифр | ||||||
П.3-2 Дополнительный код представления целых чисел со знаком.
Зачем нужен дополнительный код?
Дополнительный код позволяет операцию вычитания заменить операцией сложения → упростить конструкцию арифметическо-логического устройства ЭВМ.
Пример, поясняющий принцип организации дополнительного кода.
Дано: ЭВМ, оперирующая десятичными двухразрядными числами должна сложить 2 числа: X1=84 и X2=-32.
Решение:
1). Чтобы избежать вычитания, заменим код числа X2 на его дополнительный код [X2], вычисляемый в соответствии со следующим определением дополнительного кода:
[X2] =100 + X2 = 100 – 32 = 68 (1)
Пояснение: мы здесь именно заменили код, т.е. провели подготовительную работу.
2). Складываем:
Y = X1 + [X2] = 84 + 68 =152
3). Учитывая, что вычисления производятся на устройстве с двумя разрядами, отбрасываем старший разряд и получаем:
REZULTAT = 52
Пояснение: если на эти операции смотреть чисто математически, то мы сначала в сумму добавили 100, а затем и вычли из той же суммы 100.
Обобщая формулу (1), можно ввести определение:
Дополнением M n -разрядного целого числа K называется
M=pn + K, где p это основание системы счисления.
Общее количество целых n – разрядных чисел: pn и они лежат в диапазоне [0, pn-1 ].
Правило формирования дополнительного кода:
Числа дополнительного кода, лежащие в диапазоне [0, pn/2-1 ] соотносим с положительными числами, кодируемыми нами.
Числа дополнительного кода, лежащие в диапазоне [ pn/2, pn-1 ] соотносим с отрицательными числами, кодируемыми нами.
Таблица представления чисел в дополнительном коде:
Прямой код 5-разрядных десятичных чисел | Дополнительный код чисел | |
5-разрядный десятичный | 16-разрядный двоичный | |
-3 | 99 997 | 1 111 1111 1111 1101 |
-2 | 99 998 | 1 111 1111 1111 1110 |
-1 | 99 999 | 1 111 1111 1111 1111 |
00 000 | 0 000 0000 0000 0000 | |
+1 | 00 001 | 0 000 0000 0000 0001 |
+2 | 00 002 | 0 000 0000 0000 0010 |
+3 | 00 003 | 0 000 0000 0000 0011 |
Проверим, верна ли таблица? Сумма «положительных» и «отрицательных» чисел должна давать нуль. Проверим, выполняется ли это для чисел из таблицы.
В прямом коде: +1-1=0
В обратном коде при 10-тичной записи:
00 001 + 99 999 = 1 00 000
00 002 + 99 998 = 1 00 000
Отбрасывая старшие разряды (выходящие за пределы пяти разрядов), получаем нуль, т.е. правильный ответ.
Проделаем тоже самое для этих же чисел в двоичном представлении
0 000 0000 0000 0001
+
1 111 1111 1111 1111
1 0 000 0000 0000 0000
0 000 0000 0000 0000 0010
+
1 111 1111 1111 1111 1110
1 0 000 0000 0000 0000 0000
Аналогично предыдущему: отбрасывая старшие разряды (выходящие за пределы шестнадцати разрядов), получаем нуль, т.е. правильный ответ.