Форматы представления целых чисел
Числа в ЭВМ хранятся в соответствии с форматом. Формат – это соглашение или правила представления числа в виде последовательности бит.
Минимальная единица хранения данных в ЭВМ – 1 байт. Существуют следующие форматы представления целых чисел: байт (полуслово), слово (включает 2 байта), двойное слово (4 байта), расширенное слово (8 байт). Биты, из которых состоят эти форматы, называются разрядами. Таким образом, в байте 8 разрядов, в слове – 16 разрядов, а в двойном слове – 32 разряда. Слева находятся старшие разряды, а справа – младшие. Каждый из этих форматов может быть знаковым (рис. 5.1) для представления положительных и отрицательных чисел или беззнаковым (рис. 5.2) для представления положительных чисел.
Рис. 5.1. Знаковые форматы представления целых чисел
Знаковым является самый старший разряд. На рис. 5.1 знаковый разряд обозначен символом S. Если он равен 0, то число считается положительным, а если разряд равен 1, то число считается отрицательным.
Рис. 5.2. Беззнаковые форматы представления целых чисел
В общем виде диапазон значений, представляемых знаковыми форматами представления целых чисел (табл. 5.1) определяется по формуле
–2n–1 £ X £ 2n–1 – 1,
а для беззнакового формата определяется по формуле
0 £ X £ 2n – 1,
где n – число разрядов в формате.
Таблица 5.1. Форматы представления целых чисел в ЭВМ
Формат | Число разрядов | Диапазон (границы) | |
Знаковый | Беззнаковый | ||
Байт | –128; 127 | 0; 255 | |
Слово | –32 768; 32767 | 0; 65 535 | |
Двойное слово | –2 147 483 648; 2 147 483 647 | 0; 4 294 967 295 |
5.1.2. Прямой и дополнительный коды
представления двоичных чисел
В прямом коде старший бит кодирует знак числа (0 – для положительного, 1 – для отрицательного), а остальные биты – модуль числа.
Пример 5.1. Число 11 в прямом коде будет представляться как 0|1011п, а число –11 – как 1|1011п. □
В дополнительном коде положительное число кодируется также как и в прямом. Чтобы представить отрицательное число в дополнительном коде, существуют два способа. При представлении чисел в дополнительном коде используется операция инвертирования – замена бита на противоположный, то есть 0 на 1, а 1 на 0.
Правило 5.1. (поразрядное представление отрицательного числа в дополнительном коде) Представить модуль отрицательного числа в прямом коде и проинвертировать все разряды левее самой младшей (правой) единицы.
Пример 5.2. Представить число –11 в дополнительном коде путем инвертации разрядов.
Решение. Переведем модуль этого числа в двоичную систему: 11 = 10112 и представим его в прямом коде: 0|1011п. Самая младшая единица – последняя, поэтому ее оставляем без изменения, а остальные разряды слева инвертируем (рис. 5.3).
В результате получаем 1|0101д – представление числа –11 в дополнительном коде. □
Рис. 5.3. Представление числа –11 в дополнительном коде
Правило 5.2. (арифметическое представление отрицательного числа в дополнительном коде) Прибавить к отрицательному числу 2m, где m – количество разрядов в двоичном представлении или данном формате, и полученное число перевести в двоичную систему счисления. Для байта 28 = 256, для слова 216 = 65 536, для двойного слова 232 = 4 294 967 296.
Из этих правил можно сделать вывод, что положительные числа в случае увеличения числа разрядов дополняются слева нулями, а отрицательные – единицами.
Пример 5.3. Представить число –11 в дополнительном коде путем арифметических операций.
Решение. Пусть необходимо получить m = 5 разрядов дополнительного кода. Вычислим слагаемое 2m = 25 = 32. Произведем сложение и перевод в двоичную систему счисления:
–11 + 32 = 21 = 101012.
Полученный результат соответствует представлению числа –11 в дополнительном коде.
Для m = 8, 28 = 256:
–11 + 256 = 245 = 111101012.
Представление числа –11 было дополнено единицами слева до 8 разрядов. □
Возможно и обратное преобразование отрицательных чисел, записанных в дополнительном коде.
Правило 5.3. (поразрядное определение значения отрицательного числа, записанного в дополнительном коде) Алгоритм определения значения отрицательного числа в дополнительном коде состоит из следующих шагов.
1. Проинвертировать все разряды левее самой младшей (правой) единицы.
2. Перевести число из двоичной системы счисления в десятичную систему по правилу 4.1.
3. Умножить результат на –1.
Пример 5.4. Определить, какое десятичное число закодировано числом 1|0101д с помощью поразрядного определения.
Решение. Проинвертируем разряды числа:
1010|1д ® 0101|1п.
Переведем число из двоичной системы счисления в десятичную систему счисления:
010112 = 11.
Умножим результат на –1 и получим число –11. □
Правило 5.4. (арифметическое определение отрицательного числа, записанного в дополнительном коде) Перевести двоичное число в десятичную систему счисления и вычесть из полученного числа число 2m, где m – количество разрядов в двоичном представлении.
Пример 5.5. Определить, какое десятичное число закодировано числом 1|0101д с помощью арифметического определения.
Решение. Переведем число из двоичной системы счисления в десятичную систему счисления:
101012 = 21.
Вычтем из полученного результата перевода число 2m = 25 = 32, так как двоичное число состоит из 5 разрядов:
21 – 32 = –11.
В результате получим десятичное число –11. □
Числа в знаковых форматах записываются в дополнительном коде, а в беззнаковых – в прямом.
Запись в дополнительном коде необходима, чтобы складывать и вычитать положительные и отрицательные числа без преобразований.
Пример 5.6. Сложить 21 и –11 в двоичной системе счисления.
Решение. Переведем слагаемые в дополнительный код:
21 = 0|10101д; –11 = 1|10101д.
Будем использовать правила двоичной арифметики:
0 + 0 = 0;
1 + 0 = 0 +1 = 1;
1 + 1 = 10 (с переносом единицы в следующий разряд).
Сложим два двоичных числа столбиком с учетом того, что перенос единицы из знакового разряда игнорируется:
0101012
1101012
0010102 = 10.
В результате получено число 10 – сумма 21 и –11 без дополнительных преобразований. □
Форматы целых чисел слово и двойное слово располагаются в памяти ЭВМ в обратном порядке, то есть сначала младший байт, а затем старший. Например, слово B5DE16 будет располагаться в памяти, как показано на рис. 5.4.
Рис. 5.4. Расположение слова B5DE16 в памяти ЭВМ
Такое расположение байт удобно при операциях с числами, так как вычисления начинаются с младших разрядов, поэтому они и располагаются сначала.
5.2. Представление вещественных чисел
в памяти ЭВМ
Вещественные числа представляются в форме числа с плавающей запятой (точкой) вида:
±M × n±P,
где M – мантисса (значащая часть числа); n – основание системы счисления; P – порядок числа.
Пример 5.7. Число 2,5 × 1018 имеет мантиссу равную 2,5, а порядок равный 18. □
Мантисса называется нормализованной, если ее абсолютное значение лежит в диапазоне:
1/n £ |M| < 1,
где n – основание системы счисления.
Это условие означает, что первая цифра после запятой не равна нулю, а абсолютное значение мантиссы не превышает единицы.
Число с нормализованной мантиссой называется нормализованным.
Пример 5.8. Представить числа –245,62 и 0,00123 в форме числа с плавающей точкой.
Решение. Число –245,62 можно представить в форме числа с порядком –245,62 × 100. Мантисса этого числа не нормализована, поэтому поделим его на 103, увеличив при этом порядок:
–0,24562 × 103.
В результате число –0,24562 × 103 нормализовано.
Число 0,00123 в форме числа с порядком 0,00123 × 100 не нормализовано, так как не нормализована мантисса. Умножим мантиссу на 102, уменьшив при этом порядок:
0,123 × 10–2.
В результате число 0,123 × 10–2 нормализовано. □
В данном примере для нормализации мантиссы запятая сдвигалась вправо или влево. Поэтому такие числа называют числами с плавающей точкой. В отличие от чисел с фиксированной точкой, они значительно ускоряют арифметические операции, при этом каждый раз необходимо нормализовывать мантиссу чисел с плавающей точкой.
Для основанного на стандарте IEEE-754 представления вещественного числа в ЭВМ используются m + p + 1 бит, распределяемые следующим образом (рис. 5.5): 1 разряд знака мантиссы; p разрядов порядка; m разрядов мантиссы.
Рис. 5.5. Структура общего формата числа с плавающей точкой
Это представление называется (m, p)-форматом.
Диапазон представления чисел X (m, p)-форматом определяется из неравенства:
£ X £ (1 – 2– m –1) » .
При этом порядок числа P должен удовлетворять условию
–2p – 1 + 1 £ P £ 2p – 1 – 1
Для вещественных чисел в стандарте IEEE-754 используются (23,8)- и (52,11)-форматы, называемые одинарным и двойным вещественными форматами соответственно (табл. 5.2).
Чтобы представить значение этих порядков, количество секунд, прошедших с момента образования планеты Земля, составляет всего 1018.
Правило 5.5. (перевод десятичных чисел в (m, p)-формат) Алгоритм перевода десятичного числа X в (m, p)-формат состоит из следующих шагов.
1. Если Х = 0, то принять знаковый разряд, порядок и мантиссу за ноль и закончить алгоритм.
2. Если X > 0, то принять знаковый разряд 0, иначе принять 1. Знаковый разряд сформирован.
3. Перевести целую и дробную часть абсолютного значения числа X в двоичную систему счисления. Если число дробное, то получить m + 1 разрядов. Принять порядок равный нулю.
Таблица 5.2. Сравнительные характеристики
вещественных форматов
Характеристики | Одинарный | Двойной |
Названия в языке Турбо-Паскаль | single | double |
Размер, байт/бит | 4/32 | 8/64 |
Порядок p, бит | ||
Мантисса m, бит | ||
Смещение порядка 2p – 1 – 1 | ||
Количество значащих десятичных цифр мантиссы | 7 .. 8 | 15 .. 16 |
Диапазон десятичных порядков | –45 .. 38 | –324 .. 308 |
4. Если X ³ 1, то перенести запятую влево до самого старшего разряда и увеличить порядок, иначе перенести запятую вправо до первого ненулевого (единичного) разряда и уменьшить порядок.
5. Если число разрядов дробной части меньше m, то дополнить дробную часть нулями справа до m разрядов. Отбросить единицу из целой части. Мантисса сформирована.
6. Прибавить к порядку смещение 2p – 1 – 1 и перевести порядок в двоичную систему счисления. Порядок сформирован. Код, в котором представлен порядок, называется смещенным. Смещенный порядок упрощает сравнение, сложение и вычитание порядков при арифметических операциях.
7. Записать знаковый разряд, порядок и мантиссу в соответствующие разряды формата.
Пример 5.9. Представить число –25,6875 в одинарном вещественном формате.
Решение. В примере 4.7 был произведен перевод абсолютного значения числа –25,6875 в двоичную систему и было получено 9 разрядов:
25,6875 = 11001,10112.
Нормализуем число, сдвинув запятую влево и повысив порядок:
1,100110112 × 24.
После отбрасывания целой части остается 23 разряда дробной части (в соответствии с форматом (23,8)), записываемые как мантисса:
10011011000000000000000.
Порядок равен 4 (степень двойки после сдвига запятой влево). Произведем его смещение и перевод в двоичную систему счисления:
4 + 127 = 131 = 100000112.
Число –25,6875 отрицательное, следовательно, знаковый разряд равен 1.
Все готово для представления числа –25,6875 в одинарном вещественном формате по схеме знаковый разряд + порядок + мантисса:
1 10000011 10011011000000000000000.
Разделим это число по 8 разрядов, сформируем байты и запишем их шестнадцатеричными числами:
C1 | CD |
Таким образом, число –25,6875 можно записать как C1CD8000. □
Как и форматы целых чисел, форматы вещественных чисел хранятся в памяти ЭВМ в обратном порядке следования байт (сначала младшие, потом старшие).
Арифметические операции над числами с плавающей точкой осуществляются в следующем порядке.
При сложении (вычитании) чисел с одинаковыми порядками их мантиссы складываются (вычитаются), а результату присваивается порядок, общий для исходных чисел. Если порядки исходных чисел разные, то сначала эти порядки выравниваются (число с меньшим порядком приводится к числу с большим порядком), а затем выполняется операция сложения (вычитания) мантисс. Если при выполнении операции сложения мантисс возникает переполнение, то сумма мантисс сдвигается влево на один разряд, а порядок суммы увеличивается на 1.
При умножении чисел их мантиссы перемножаются, а порядки складываются.
При делении чисел мантисса делимого делится на мантиссу делителя, а для получения порядка частного из порядка делимого вычитается порядок делителя. При этом если мантисса делимого больше мантиссы делителя, то мантисса частного окажется больше 1 (происходит переполнение) и запятую следует сдвинуть влево, одновременно увеличив порядок частного.