Учебное пособие для иностранных студентов (1110580), страница 2
Текст из файла (страница 2)
Пусть процесс решения некоторой задачи состоит из трех отрезков счета (работы ЦП), двух печатей и одной записи данных на диск:
По окончании этапа Счет 1, когда получены данные для первой печати, принтер может заняться печатью, а ЦП может продолжить решение задачи. После получения данных для диска, дисковод начинает записывать, а ЦП может продолжить работу. В итоге, общее время решения задачи сократится.
§3. Представление целых чисел в ЭВМ.
Для удобства вычислений будем считать, что ячейка состоит из 8 разрядов (битов). Байт - 8 битов. Слово "байт" используется как для обозначения ячейки (например, при описании ОП), так и для обозначения содержимого ячейки. Путаницы при этом не возникает, так как всегда ясно, идет речь о физическом устройстве, или о математическом объекте.
П.1. Числа без знака.
Как использовать данные нам 8 битов для изображения числа? Первая мысль, которая приходит в голову - считать, что эти биты являются цифрами в записи числа в двоичной системе счисления. Тогда самый правый бит является коэффициентом при 20, второй справа - при 21 и т.д.
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
При этих условиях байт 10010101 изображает число
1·27+0·26+0·25+1·24+0·23+1·22+0·21+1·20=128+16+4+1=149.
Такое представление числа называется прямым кодом числа. Этим способом можно представлять (изображать в виде байта) все целые числа от 0 (байт 00000000) до 255 (байт 11111111). Если мы трактуем содержимое байта таким образом, оно (содержимое) называется числом без знака.
Итак, байт может содержать число без знака, или содержимое байта может быть числом без знака.
П.2. Числа со знаком.
Хотелось бы иметь возможность работать и с отрицательными числами (например, для того, чтобы применять операцию вычитания). В нашем распоряжении имеется всего 28=256 возможных значений байта. Какое множество целых чисел мы хотели бы изобразить с помощью этих комбинаций? Было бы удобно, чтобы изображаемое множество было связное (в него входили бы подряд идущие целые числа); чтобы положительных и отрицательных чисел было одинаковое количество. Следовательно, нас интересует множество из 256 подряд идущих чисел, расположенное симметрично относительно 0. Например, множество [-128,127].
Как изобразить эти числа с помощью байтов? Пусть байты от 0 (00000000) до 127 (01111111) изображают сами себя - целые числа от 0 до 127. Тогда байты от 128 (10000000) до 255 (11111111) должны соответствовать отрицательным числам.
Замечание: Обратим внимание на старший (самый левый) бит байта. У байтов, изображающих положительные числа, он равен 0. У байтов, изображающих отрицательные числа, он равен 1. Поэтому старший бит часто называют знаковым. При этом считается, что 0 изображает знак "+", а 1 – знак "-". Если считать, что байт изображает число описанным способом, говорят, что байт содержит число со знаком.
Пусть
-1 | представляется байтом 11111111 (255 в двоичной системе) |
-2 | представляется байтом 11111110 (254 в двоичной системе) |
• • • | |
-10 | представляется байтом 11110110 (246 в двоичной системе) |
-128 | представляется байтом 10000000 (128 в двоичной системе) |
Такое представление отрицательных чисел называется представлением в дополнительном коде, поскольку представление числа x и представление числа -x дополняют друг друга до 256 (28).
Определение. Пусть x - число из диапазона [-128, -1]. Представлением числа x в дополительном коде называется число 256 - x .
Замечания.
-
Можно дать другое, эквивалентное приведенному, определение понятия "представление числа со знаком": для любого числа x[-128,127] представление x есть двоичное восьмиразрядное число x mod 256.
-
Мы рассмотрели две возможных трактовки содержимого байта. Причем, в обоих случаях каждый байт из 00000000 01111111 изображает одно и то же положительное число. А каждый байт из диапазона 10000000 11111111 изображает два разных числа. Например, байт 11110000 изображает число без знака 240 и число со знаком -16.
П.3. Способы получения дополнительного кода числа.
Пусть число x принадлежит интервалу [-128, 0[. Есть несколько способов получения его представления в дополнительном коде.
1 способ. По определению дополнительного кода.
Представление x = | 256-| x | = 128 + | (128 -| x | ) |
'1' в знаковом разряде | представление числа в двоичной системе с использованием 7 разрядов (т.к. 0 128 -| x |127 ) |
2 способ. Через обратный код.
Представление x = | 256-| x | = | 255-| x | | + 1 | |
инвертированное представление числа | x | |
В инвертированном представлении все нули заменены единицами, и наоборот. Такое представление называется обратным кодом числа | x |.
Таким образом, можно сформулировать следующий алгоритм:
1. выписать представление числа | x | (прямой код | x |),
2. получить обратный код | x | (инвертировав все разряды прямого кода),
3. прибавить 1.
3 способ. Вычитанием из 255.
Представление x = | 256 - | x | = 255 - | (| x | - 1) | |
0 | x | 128, следовательно | |||
0 | x | - 1 128, то есть это положительное число представимо в виде байта |
Отсюда вытекает алгоритм:
1. получить представление числа | x | - 1,
2. вычесть полученное число из 255.
Заметим, что выполнить вычитание из 255 в двоичной системе довольно просто, так как 255=111111112.
Примеры. Получить представление в дополнительном коде для следующих чисел.
Пример 1. x= -118.
Применим первый способ.
128 + (128 - 118) = 128 + 10 = 2
Ответ: 10001010.
Пример 2. x= -100.
128 + (128 - 100) = 128 + 28 = 128 + (16 + 8 + 4 ) = 2
Ответ: 10011100.
Пример 3. x= -15.
Используем второй способ.
а) прямой код числа | x | : 15 = 8 + 4+ 2+ 1 = 000011112
б) обратный код: 111100002
в) дополнительный код: 111100012
Ответ: 11110001.
Пример 4. x= -30
а) прямой код числа | x | : 30 = 16 + 8 + 4 + 2 = 000111102
б) обратный код: 111000012
в) дополнительный код: 111000102
Ответ: 11100010.
Пример 5. x= -47.
Используем третий способ.
а) | x | - 1 = 46 = 32 + 8 + 4+ 2 = 001011102
б) 255 - (| x | - 1) = 111111112 - 001011102 = 110100012
Рассмотрим следующую задачу. Пусть есть байт , изображающий число
x[-127,127]. Как получить байт – изображение числа -x?
Из соотношения ((-a) mod b + a mod b) mod b = 0 можно вывести, что
Следовательно, = 256 -
для всех x 0. Для вычисления значения 256 -
подходит алгоритм получения дополнительного кода через обратный код (
(0, 255]).
При x=0 применение алгоритма получения дополнительного кода через обратный код даёт нулевой байт.
Таким образом, получить число со знаком, обратное данному, можно, применив алгоритм вычисления дополнительного кода числа.При этом, если применить этот алгоритм второй раз, вернемся к исходному числу ( что вполне оправдано: -(-x)= x ).
Напомним, что представимое множество целых чисел со знаком не совсем симметрично: в него входит число -128, и не входит число 128. Отсюда следует, что применение операции получения обратного для числа -128 будет некорректным. Если формально применить алгоритм получения дополнительного кода, получим
-128 = 100000002
1. Прямой код 10000000
2. Обратный код 01111111
3. +1 10000000
Как видим, получается исходное число -128.
Данный пример показывает, что число -128 является в некотором смысле особенным; при программировании это следует учитывать.
Замечание. Все рассмотрения пунктов 13 легко можно повторить для любой другой (не равной 8) размерности ячейки.
Примеры.
Определить, какое число без знака и какое число со знаком содержит байт.
Пример 1. Дан байт 00110111.
1). Число без знака получается переводом данного числа в десятичную систему:
32 + 16 + 4 + 2 + 1 = 55.
2) Число со знаком. Мы знаем, что байты из интервала [0, 127] изображают число со знаком, совпадающее с числом без знака.
Ответ: число без знака 55;
число со знаком 55.
Пример 2. Дан байт 10111001.
1). Число без знака получается переводом данного числа в десятичную систему:
128 + 32 + 16 + 8 + 1 = 185.
2) Число со знаком. Так как 185 > 127, число 185 является дополнительным кодом для некоторого отрицательного числа x: 185 = 256 - | x |, | x | = 256 - 185 = 71. Поскольку x<0, то x= -71.