Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Представление целых беззнаковых чисел
Проще всего эта проблема решается для случая целых беззнаковых (то есть, все данные имеют только один знак, который поэтому можно опустить) чисел. Перевод такого числа из десятичной системы в двоичную можно осуществить с помощью целочисленного деления по следующему алгоритму: 1. Если текущее число меньше 2, то записать его в младший разряд результата, выполнение прекратить. Иначе, разделить текущее число с остатком на 2. 2. Остаток записать в младший разряд результата. 3. Применить пункт 1 к частному. Это можно наглядно продемонстрировать с помощью деления «уголком».
Деление «уголком» Теперь достаточно записать справа налево выделенные цифры, и получится ответ: 10 00110111. Чтобы представить это число в системе с фиксированным числом разрядов (например, 16), нужно неиспользованные старшие разряды заполнить нулями: 00000010 00110111. Обратный перевод осуществляется гораздо более тривиальным способом: необходимо просуммировать все цифры двоичного числа, умноженные на число 2номер разряда, нумерация разрядов начинается с младшего (правого), которому соответствует номер 0. то есть: 1∙ 29+0∙ 28+0∙ 27+0∙ 26+1∙ 25+1∙ 24+0∙ 23+1∙ 22+1∙ 21+1∙ 20=512+0+0+0+32+16+0+4+2+1=567. Шестнадцатеричная система как удобная форма записи Все эти вычисления занимают время и требуют большой внимательности при выполнении, поэтому использовать десятичную систему в программировании не очень удобно. Неудобно использовать также и двоичную систему из-за большого числа разрядов. Для того, чтобы представлять в удобочитаемой форме двоичные данные используется шестнадцатеричная система счисления. В ней используются цифры от 0 до 9 и латинские буквы от A до F.
Эта система счисления обладает очень важным свойством: любые четыре цифры двоичного числа (называемые тетрадой ) всегда соответствуют одному шестнадцатеричному знаку:
Поэтому совершенно тривиально осуществляется перевод из двоичной системы в шестнадцатеричную и обратно: достаточно запомнить эту таблицу, и просто заменять тетрады соответствующими знаками или наоборот. Таким образом, максимальное значение одного байта записывается как FF16, а максимальное значение, с которым может работать 32-разрядный процессор без применения математического сопроцессора – FFFFFFFF16. Восьмиричная система счисления Для более компактной записи двоичных данных используется восьмиричная система счисления. В ней используются цифры от 0 до 7.
Поэтому совершенно тривиально осуществляется перевод из двоичной системы в восьмиричную и обратно: достаточно запомнить эту таблицу, и просто заменять триады соответствующими знаками или наоборот. Представление целых знаковых чисел Прямой код
Прямой и дополнительный коды Итак, представление целых беззнаковых чисел в двоичном коде проблемы не составляет. Возникает вопрос, что делать с целыми знаковыми числами. Первое и очевидное решение – это использовать старший бит двоичного числа для хранения знака: 0, если знак «+» и 1, если знак «− ». Подобное решение называют прямым кодом. Например, для случая 8-разрядной системы, 6510=010000012, а − 6510=110000012. Однако данная система создаёт серьёзную проблему: a− b≠ a+(− b). Действительно: 00110010− 00110010=0, а 00110010+10110010=11100100, что абсурдно. Значит, нужно на уровне процессора отдельно определять операции сложения и вычитания, всегда следить за тем, чтобы вычисления производились с числами одного знака. Знак же результата определять путём сравнения исходных чисел. Дополнительный код Существует другое, не вполне очевидное на первый взгляд, но очень эффективное решение – дополнительный код. Чтобы изменить знак числа в дополнительном коде, нужно выполнить такую операцию − a=ā +1, где черта над буквой – знак инверсии, замены всех нулей единицами, а единиц нулями. 6510=010000012, а − 6510=101111102. Попробуем сложить эти два числа – получим 1 000000002, то есть, 256. Вспомним, однако, что мы работаем с 8-разрядной системой, а число 1 000000002 в ней записать невозможно. Поэтому старший бит 1 выйдет за границы числа, и в итоге останется 000000002, что является верным. Интересно заметить, что старший бит числа по-прежнему отвечает за знак, а потому можно использовать его значение для того, чтобы узнать знак числа. Но уже нельзя использовать простую инверсию старшего бита для смены знака. Тем не менее, такое небольшое усложнение операции смены знака ведёт к огромному упрощению остальных операций – их можно производить, не задумываясь о знаке, результат всегда будет верным. Популярное:
|
Последнее изменение этой страницы: 2017-03-08; Просмотров: 2200; Нарушение авторского права страницы