Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии 


Представление целых беззнаковых чисел




Проще всего эта проблема решается для случая целых беззнаковых (то есть, все данные имеют только один знак, который поэтому можно опустить) чисел. Перевод такого числа из десятичной системы в двоичную можно осуществить с помощью целочисленного деления по следующему алгоритму:

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.

010=016 810=816
110=116 910=916
210=216 1010=A16
310=316 1110=B16
410=416 1210=C16
510=516 1310=D16
610=616 1410=E16
710=716 1510=F16
810=816 1610=1016

Эта система счисления обладает очень важным свойством: любые четыре цифры двоичного числа (называемые тетрадой) всегда соответствуют одному шестнадцатеричному знаку:

00002=016 10002=816
00012=116 10012=916
00102=216 10102=A16
00112=316 10112=B16
01002=416 11002=C16
01012=516 11012=D16
01102=616 11102=E16
01112=716 11112=F16
10002=816 100002=1016

 

Поэтому совершенно тривиально осуществляется перевод из двоичной системы в шестнадцатеричную и обратно: достаточно запомнить эту таблицу, и просто заменять тетрады соответствующими знаками или наоборот. Таким образом, максимальное значение одного байта записывается как FF16, а максимальное значение, с которым может работать 32-разрядный процессор без применения математического сопроцессора – FFFFFFFF16.

Восьмиричная система счисления

Для более компактной записи двоичных данных используется восьмиричная система счисления. В ней используются цифры от 0 до 7 .

010=08 810=118
110=18 910=128
210=28 1010=138
310=38 1110=148
410=48 1210=158
510=58 1310=168
610=68 1410=178
710=78 1510=208
810=108 1610=218

 

0002=08  
0012=18  
0102=28  
0112=38  
1002=48  
1012=58  
1102=68  
1112=78  
10002=108  

Поэтому совершенно тривиально осуществляется перевод из двоичной системы в восьмиричную и обратно: достаточно запомнить эту таблицу, и просто заменять триады соответствующими знаками или наоборот.

Представление целых знаковых чисел

Прямой код

 

Прямой и дополнительный коды

Итак, представление целых беззнаковых чисел в двоичном коде проблемы не составляет. Возникает вопрос, что делать с целыми знаковыми числами. Первое и очевидное решение – это использовать старший бит двоичного числа для хранения знака: 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; Просмотров: 1491; Нарушение авторского права страницы


lektsia.com 2007 - 2020 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.005 с.) Главная | Обратная связь