Системы счисления, переводы чисел
МИНИСТЕРСТВО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ.
ИРКУТСКИЙ ГОСУДАРСТВЕННЫЙ
ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ.
ФАКУЛЬТЕТ КИБЕРНЕТИКИ.
КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ.
Курсовая работа по информатике
На тему:
Системы счисления, переводы чисел.
Выполнил: студент Иванов Д. Г.
Группы ЭВМ 05-3
Проверил: Горохов А.Г.
ИРКУТСК
Оглавление.
Оглавление………………………………………………………………………..1
Глава 1.История развития систем счисления……..………………………..2
1.1 Зарождение систем счисления………………………………………………2
1.2 Образование десятичной системы счисления……………………………....4
Глава 2. Системы счисления…………….…………………………………..5
2.1 Позиционные и непозиционные системы счисления………………………5
2.2 Двоичная(бинарная) система счисления…………………………………….6
2.3. Восьмеричная система счисления…………………………………………..6
2.4. Десятеричная система счисления…………………………………………...6
2.5. Шестнадцатеричная система счисления……………………………………7
Глава 3. Представление чисел в ЭВМ…………………………………..8
3.1 Представление чисел с фиксированной и плавающей запятой.………...…8
3.2 Числа с фиксированной запятой…………………………………………….8
3.3 Числа с плавающей запятой…………………………………………………9
3.3 Прямой, обратный и дополнительный коды. Модифицированный код…10
Глава 4. Перевод чисел…………………………………………………...13
4.1 Представление двоичных чисел и перевод их в десятичные…………….13
4.2 Преобразование десятичных чисел в двоичные…………………………..13
4.2.1 Метод деления……………………………………………………………..13
4.2.2 Метод умножения………………………………………………………….14
5.Постановка задачи………………………………………………………15
6.Внешнее проектирование программы…………………………………15
7.Математическая модель………………………………………………...16
8.Кодирование и отладка программы….……………………………...…17
9.Таблица тестов…………………………………………………………..23
10.Список литературы………………………………………..…………..24
Глава 1.История развития систем счисления.
1.1 Зарождение систем счисления.
На ранних ступенях развития общества люди почти не умели считать. Они отличали друг от друга совокупности двух и трех предметов; всякая совокупность, содержавшая большее число предметов, объединялась в понятии «много». Это был еще не счет, а лишь его зародыш.
Впоследствии способность различать друг от друга небольшие совокупности развивалась; возникли слова для обозначений понятий «четыре», «пять», «шесть», «семь». Последнее слово длительное время обозначало также неопределенно большое количество.
С усложнением хозяйственной деятельности людей понадобилось вести счет в более обширных пределах. Для этого человек пользовался окружавшими его предметами, как инструментами счета: он делал зарубки на палках и на деревьях, завязывал узлы на веревках, складывал камешки в кучки и т.п. Это удобно, так как сразу визуально определяется количество знаков и сопоставляется с количеством предметов, которые эти знаки обозначают. Все мы ходили в первый класс и считали там на счетных палочках – это отзвук той далекой эпохи. Кстати, от счета с помощью камешков ведут свое начало различные усовершенствованные инструменты, как, например, русские счеты, китайские счеты («сван-пан»), древнеегипетский «абак» (доска, разделенная на полосы, куда клались жетоны). Аналогичные инструменты существовали у многих народов. Более того, в латинском языке понятие «счет» выражается словом «calculatio» (отсюда наше слово «калькуляция»); а происходит оно от слова «calculus», означающего «камешек».
Особо важную роль играл природный инструмент человека – его пальцы. Этот инструмент не мог длительно хранить результат счета, но зато всегда был «под рукой» и отличался большой подвижностью. Язык первобытного человека был беден; жесты возмещали недостаток слов, и числа, для которых еще не было названий, «показывались» на пальцах.
Поэтому, вполне естественно, что вновь возникавшие названия «больших» чисел часто строились на основе числа 10 – по количеству пальцев на руках; у некоторых народов возникали также названия чисел на основе числа 5 – по количеству пальцев на одной руке или на основе числа 20 – по количеству пальцев на руках и ногах.
На первых порах расширение запаса чисел происходило медленно. Сначала люди овладели счетом в пределах нескольких десятков и лишь позднее дошли до сотни. У многих народов число 40 долгое время было пределом счета и названием неопределенно большого количества. В русском языке слово «сороконожка» имеет смысл «многоножка»; выражение «сорок сороков» означало в старину число, превосходящее всякое воображение.
На следующей ступени счет достигает нового предела: десяти десятков, и создается название для числа 100. Вместе с тем слово «сто» приобретает смысл неопределенно большого числа. Такой же смысл приобретают потом последовательно числа тысяча, десять тысяч (в старину это число называлось «тьма»), миллион.
На современном этапе границы счета определены термином «бесконечность», который не обозначает, какое либо конкретное число.
Обозначение чисел в разных системах счисления |
1.2 Образование десятичной системы счисления.
В современном русском языке, а также в языках других народов названия всех чисел до миллиона составляются из 37 слов, обозначающих числа 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 , 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 (например, восемьсот пятнадцать тысяч триста девяносто четыре). В свою очередь названия этих 37 чисел, как правило, образованы из названий чисел первого десятка (1, 2, 3, 4, 5, 6, 7, 8, 9) и чисел 10, 100, 1000 (например, 18 = восемь на десять, 30 = тридесять и т.д.). В основе этого словообразования лежит число десять, и поэтому наша система наименований называется десятичной системой счисления.
Из упомянутого правила в разных языках имеются различные исключения, объясняющиеся историческими особенностями развития счета. В русском языке единственным исключением является наименование «сорок». Это исключение можно поставить в связь с тем, что число 40 играло некогда особую роль, означая неопределенно большое количество.
В тюркских языках (узбекском, казахском, татарском, башкирском, турецком и др.) исключение составляют наименования чисел 20, 30, 40, 50, тогда как названия чисел 60, 70, 80, 90 образованы из наименований для 6, 7, 8, 9. Во французском языке сохранились недесятичные названия чисел 20 и 80, причем 80 именуется quatrevingt, т.е. «четыре двадцать». Здесь мы имеем остаток древнего двадцатеричного счисления (по числу пальцев на руках и ногах). В латинском языке наименование числа 20 тоже недесятичное (viginti). Наименования чисел 18 и 19 образованы из названия 20 с помощью вычитания: 20–2 и 20–1 (duodeviginti, undeviginti, т.е. «два от двадцати», «один от двадцати»).
Глава 2. Системы счисления.
2.1 Позиционные и непозиционные системы счисления.
Системой счисления называют систему приемов и правил, позволяющих устанавливать взаимнооднозначное соответствие между любым числом и его представлением в виде совокупности конечного числа символов. Множество символов, используемых для такого представления, называют цифрами.
Системы счисления делятся на два класса позиционные и непозиционные.
В непозиционных системах любое число определяется как некоторая функция от численных значений совокупности цифр, представляющих это число. Простейшая, но абсолютно неудобная система счисления. Основана на единственной цифре – единице (палочке). Позволяет записывать только натуральные числа. Чтобы представить число в этой системе счисления нужно записать столько палочек, каково само число. Использовалась нецивилизованными племенами, потребности которых в счете, как правило, не выходили за рамки первого десятка. Чисто формально единичную систему счисления можно отнести к числу основных (с основанием 1). Но, в отличие от остальных основных систем счисления, считать ее позиционной можно лишь с очень сильной натяжкой, а универсальной она вообще не является (в ней нельзя представить ноль, дроби и отрицательные числа). Римская система счисления. С помощью семи цифр – I=1 , V=5 , X=10 , L=50 , C=100 , D=500 , M=1000 – можно весьма успешно и довольно выразительно представлять натуральные числа в диапазоне до нескольких тысяч.
Исторически первыми системами счисления были именно непозиционные системы. Одним из основных недостатков является трудность записи больших чисел. Запись больших чисел в таких системах либо очень громоздка, либо алфавит системы чрезвычайно велик.
В вычислительной технике непозиционные системы не применяются, но продолжают ограниченно использоваться для указания порядковых числительных (часов, столетий, номеров съездов или конференций и т.п.).
Позиционная система счисления – система счисления, в которой вес цифры меняется с изменением положения цифры в числе, но при этом полностью определяется написанием цифры и местом, которое она занимает. В частности, это означает, что вес цифры не зависит от значений окружающих ее цифр. Такая система счисления основывается на том, что некоторое число n единиц ( основание системы счисления ) объединяются в одну единицу второго разряда, n единиц второго разряда объединяются в одну единицу третьего разряда и т. д. Основанием систем счисления может быть любое число, больше единицы. К числу таких систем относится современная десятичная система счисления ( с основанием n=10 ). В ней для обозначения первых десяти чисел служат цифры 0,1,…,9.
Несмотря на кажущуюся естественность такой системы, она явилась результатом длительного исторического развития. Возникновение десятичной системы счисления связывают со счетом на пальцах.
В отличии от непозиционной системы счисления, позиционная система счисления применяется в ЭВМ.
2.2 Двоичная(бинарная) система счисления.
В настоящий момент – наиболее употребительная в информатике, вычислительной технике и смежных отраслях система счисления. Использует две цифры – 0 и 1, а также символы «+» и «–» для обозначения знака числа и запятую (точку) для разделения целой и дробной части. Таким образом, в двоичном счислении любое число можно представить двумя числами: 0 и 1. Для представления этих чисел в цифровых системах достаточно иметь электронные схемы, которые могут принимать два состояния, четко различающиеся значением какой-либо электрической величины – потенциала или тока. Одному из значений этой величины соответствует цифра 0, другому 1. Относительная простота создания электронных схем с двумя электрическими состояниями и привела к тому, что двоичное представление чисел доминирует в современной цифровой технике. При этом 0 обычно представляется низким уровнем потенциала, а 1 – высоким уровнем. Такой способ представления называется положительной логикой.
История развития двоичной системы счисления – одна из ярких страниц в истории арифметики. Официальное «рождение» двоичной арифметики связывают с именем Г. В. Лейбница, опубликовавшего статью, в которой были рассмотрены правила выполнения всех арифметических операций над двоичными числами. До начала тридцатых годов XX века двоичная система счисления оставалась вне поля зрения прикладной математики. Потребность в создании надежных и простых по конструкции счетных механических устройств и простота выполнения действий над двоичными числами привели к более глубокому и активному изучению особенностей двоичной системы как системы, пригодной для аппаратной реализации. Первые двоичные механические вычислительные машины были построены во Франции и Германии. Утверждение двоичной арифметики в качестве общепринятой основы при конструировании ЭВМ с программным управлением состоялось под несомненным влиянием работы А. Бекса, Х. Гольдстайна и Дж. Фон Неймана о проекте первой ЭВМ с хранимой в памяти программой, написанной в 1946 году. В этой работе наиболее аргументировано обоснованы причины отказа от десятичной арифметики и перехода к двоичной системе счисления как основе машинной арифметики.
2.3. Восьмеричная система счисления.
Использует восемь цифр – 0, 1, 2, 3, 4, 5, 6, и 7, а также символы «+» и «–» для обозначения знака числа и запятую (точку) для разделения целой и дробной частей числа. Широко использовалась в программировании в 1950-70-ые гг. К настоящему времени практически полностью вытеснена шестнадцатеричной системой счисления, однако функции перевода числа из десятичной системы в восьмеричную и обратно сохраняются в микрокалькуляторах и многих языках программирования.
2.4. Десятеричная система счисления.
Использует десять обычных цифр – 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9, а также символы «+» и «–» для обозначения знака числа и запятую (точку) для разделения целой и дробной частей числа. Существует массовое заблуждение, будто именно десятичная система счисления является наиболее употребительным способом записи чисел. Между тем, более внимательный анализ правил чтения и записи чисел приводит к другому выводу: система счисления, которой мы обычно пользуемся, фактически является двойной, так как имеет основания – 10 и 1000. В частности, в русском языке известны названия только для первых семи разрядов десятичной системы счисления ( 1 – единица, 10 – десяток, 100 – сотня, 1000 – тысяча, 10000 – тьма, 100000 – легион, 1000000 – миллион ), но предпоследние два из них (легион и тьма) давно вышли из употребления, а соседние с ними (миллион и тысяча) – названия классов, а не только разрядов. Итак, фактически в русском языке остались лишь два самостоятельных названия для десятичных разрядов: десяток и сотня. В других языках – аналогичная ситуация.
2.5. Шестнадцатеричная система счисления.
Использует шестнадцать цифр – 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9 в их обычном смысле, а затем A=10, B=11 , C=12 , D=13 , E=14 , F=15 . Также использует символы «+» и «–» для обозначения знака числа и запятую (точку) для разделения целой и дробной частей числа. Внедрена американской корпорацией IBM. Широко используется в программировании для IBM-совместимых компьютеров. С другой стороны, в некоторых языках сохранились и следы использования этой системы счисления в прошлом. Например, в романских языках (испанском, французском и др.) числительные от 11 до 16 образуются по одному правилу, а от 17 до 19 – по другому. А в русском языке известен пуд, равный 16 килограммам.
BIN |
OCT |
DEC |
HEX |
0 |
0 |
0 |
0 |
001 |
1 |
1 |
1 |
010 |
2 |
2 |
2 |
011 |
3 |
3 |
3 |
100 |
4 |
4 |
4 |
101 |
5 |
5 |
5 |
110 |
6 |
6 |
6 |
111 |
7 |
7 |
7 |
1 000 |
10 |
8 |
8 |
1 001 |
11 |
9 |
9 |
1 010 |
12 |
10 |
A |
1 011 |
13 |
11 |
B |
1 100 |
14 |
12 |
C |
1 101 |
15 |
13 |
D |
1 110 |
16 |
14 |
E |
1 111 |
17 |
15 |
F |
10 000 |
20 |
16 |
10 |
Глава 3. Представление чисел в ЭВМ.
3.1 Представление чисел с фиксированной и плавающей запятой.
При представлении числа в двоичном коде с цифрами 0,1 в каждом разряде записываются цифры 0 или 1. Так как в ЭВМ «запись» числа осуществляется с помощью технических устройств, то для представления его в такой форме необходимо располагать устройствами с двумя надежно различными состояниями, которым могут быть сопоставлены значения 0 или 1. Комбинация таких устройств, число которых соответствует количеству разрядов записываемого числа, может быть использована для представления чисел в ЭВМ.
В качестве таких устройств, могут быть использованы триггеры. Набор триггеров, предназначенных для представления чисел в ЭВМ, а также для выполнения над ними некоторых логических преобразований, называется регистром. Разумеется, число разрядов, отведенное для записи числа, соответствующее числу триггеров, в ЭВМ всегда конечно. Выбор количества разрядов для представления чисел в ЭВМ является одним из самых ответственных этапов конструирования вычислительной машины и обуславливается целым рядом требований, среди которых одно из важнейших – необходимая точность вычислений.
В ЭВМ применяются две основные формы представления чисел: полулогарифмическая – с плавающей запятой и естественная – с фиксированным положением запятой.
При представлении чисел с фиксированной запятой положение запятой закрепляется в определенном месте относительно разрядов числа и сохраняется неизменным для всех чисел, изображаемых в данной разрядной сетке. Обычно запятая фиксируется перед старшим разрядом или после младшего. В первом случае в разрядной сетке могут быть представлены только числа, которые по модулю меньше 1, во втором – только целые числа.
Использование представления чисел с фиксированной запятой позволяет упростить схемы машины, повысить ее быстродействие, но представляет определенные трудности при программировании. В настоящее время представление чисел с фиксированной запятой используется как основное только в микроконтроллерах.
В универсальных ЭВМ основным является представление чисел с плавающей запятой. Широкий диапазон представления чисел с плавающей запятой удобен для научных и инженерных расчетов. Для повышения точности вычислений во многих ЭВМ предусмотрена возможность использования формата двойной длины, однако при этом происходит увеличение затрат памяти на хранение данных и замедляются вычисления.
Рассмотрим подробнее эти два формата.
3.2 Числа с фиксированной запятой.
Формат для чисел с запятой, фиксированной перед старшим разрядом. В этом формате могут быть с точностью до представлены числа (правильные дроби) в диапазоне
.
Первые ЭВМ были машинами с фиксированной запятой, причем запятая фиксировалась перед старшим разрядом числа. В настоящее время, как правило, форму с фиксированной запятой применяют для представления целых чисел (запятая фиксирована после младшего разряда).
Используют два варианта представления целых чисел: со знаком и без знака. В последнем случае все разряды разрядной сетки служат для представления модуля числа. В ЕС ЭВМ применяются оба указанных варианта представления целых чисел, причем каждый из вариантов реализуется как в формате 32-разрядного машинного слова этих машин, так и в формате 16-разрядного полуслова.
При выполнении арифметических действий над правильными дробями могут получаться двоичные числа, по абсолютной величине больше или равные единице, что называется переполнением разрядной сетки. Для исключения возможности переполнения приходится масштабировать величины, участвующие в вычислениях.
Достоинство представления чисел в форме с фиксированной запятой состоит в простоте выполнения арифметических операций.
Недостатки – в необходимости выбора масштабных коэффициентов и в низкой точности представления с малыми значениями модуля (нули в старших разрядах модуля приводит к уменьшению количества разрядов, занимаемых значащей частью модуля числа).
3.3 Числа с плавающей запятой.
При использовании плавающей запятой число состоит из двух частей: мантиссы m, содержащей значащие цифры числа, и порядка p, показывающего степень, в которую надо возвести основание числа q, чтобы полученное при этом число, умноженное на мантиссу, давало истинное значение представляемого числа:
(5.1)
Мантисса и порядок представляются в двоичном коде. Обычно число дается в нормализованном виде, когда его мантисса является правильной дробью, причем первая значащая цифра (единица) следует непосредственно после запятой: например, где m=0,1010; p=10; q=2
Порядок указывает действительное положение запятой в числе. Код в приведенном формате представляет значение числа в полулогарифмической форме:
Точность представления значений зависит от количества значащих цифр мантиссы. Для повышения точности числа с плавающей запятой представляются в нормализованной форме, при которой значение модуля мантиссы лежит в пределах
Нормализованные двоичные числа с плавающей запятой представляют значения модуля в диапазоне:
где – максимальное значение модуля порядка.
Так, при p=7
Таким образом, диапазон чисел:
Для расширения диапазона представляемых чисел при фиксированной длине разрядной сетки (m+p) в качестве основания системы счисления выбирается до
m m – 1 1 p p – 1 1
… |
… |
Знак Модуль мантиссы Знак Модуль порядка
числа порядка
3.3 Прямой, обратный и дополнительный коды. Модифицированный код
При рассмотрении элементарных арифметических операций над двоичными числами мы уже коснулись темы отрицательных двоичных чисел. Теперь рассмотрим ее подробнее.
Для кодирования знака двоичного числа используется старший ("знаковый") разряд (ноль соответствует плюсу, единица – минусу).
Такая форма представления числа называется прямым кодом.
В ЭВМ прямой код применяется только для представления положительных двоичных чисел. Для представления отрицательных чисел применяется либо дополнительный, либо обратный код, так как над отрицательными числами в прямом коде неудобно выполнять арифметические операции.
Правила для образования дополнительного и обратного кода состоят в следующем:
· для образования дополнительного кода отрицательного числа необходимо в знаковом разряде поставить единицу, а все цифровые разряды инвертировать (заменить 1 на 0, а 0 – на 1), после чего прибавить 1 к младшему разряду;
· для образования обратного кода отрицательного числа необходимо в знаковом разряде поставить единицу, а все цифровые разряды инвертировать;
· при данных преобразованиях нужно учитывать размер разрядной сетки.
Прямой код можно получить из дополнительного и обратного по тем же правилам, которые служат для нахождения дополнительного и обратного кодов.
В таблице 5.1 пpиведены десятичные числа и их двоичные пpедставления в тpех pазличных фоpмах. Интеpесно в ней вот что. Если начать счет с числа 1000 (–8) и двигаться вниз по столбцам, то в дополнительном коде каждое последующее число получается пpибавлением единицы к пpедыдущему без учета пеpеноса за пpеделы четвеpтого pазpяда Так пpосто эту опеpацию в пpямом и обpатном кодах не осуществить. Эта особенность дополнительного кода и явилось пpичиной пpедпочтителного пpименения его в совpеменных микpо и миниЭВМ.
Итак, числа, пpедставленные в дополнительном коде, складываются по пpавилам двоичного сложения, но без учета каких либо пеpеносов за пpеделы стаpшего pазpяда. Рассмотpим это на пpимеpах 5.1.
Прямой, обратный и дополнительный коды
.
Десятичное число |
Прямой код |
Обратный код |
Дополнительный код |
-8 |
– |
– |
1000 |
-7 |
1111 |
1000 |
1001 |
-6 |
1110 |
1001 |
1010 |
-5 |
1101 |
1010 |
1011 |
-4 |
1100 |
1011 |
1110 |
-3 |
1011 |
1100 |
1101 |
-2 |
1010 |
1101 |
1110 |
-1 |
1001 |
1110 |
1111 |
0 |
1000 0000 |
1111 0000 |
0000 |
1 |
0001 |
0001 |
0001 |
2 |
0010 |
0010 |
0010 |
3 |
0011 |
0011 |
0011 |
4 |
0100 |
0100 |
0100 |
5 |
0101 |
0101 |
0101 |
6 |
0110 |
0110 |
0110 |
7 |
0111 |
0111 |
0111 |
Еще одним достоинством дополнительного кода является то, что нуль, в отличие от пpямого и обpатного кодов, пpедставляется одним кодом. Наличие 0 в знаковом бите пpи пpедставлении нуля опpеделяет его как величину положительную, что согласуется с математической теоpией чисел и соглашениями, пpинятыми во всех языках пpогpаммиpования.
Из приведенных примеров следует, что положительные числа в прямом, обратном и дополнительном кодах совпадают. В прямом и обратном коде нуль имеет два представления – «положительный» и «отрицательный» нуль.
Отметим, что при представлении с плавающей запятой отдельно кодируется мантисса и порядок числа. При этом возможно представление мантисс и порядков чисел в одном и том же или разных кодах. Например, порядок числа может быть представлен в прямом, а мантисса – в дополнительном кодах и т. п.
Таким образом, используя обратный и дополнительный коды, операцию алгебраического сложения можно свести к арифметическому сложению кодов чисел, которое распространяется и на разряды знаков, которые рассматриваются как разряды целой части числа.
При сложении чисел, меньших единицы, в машине быть получены числа, по абсолютной величине большие единицы. Для обнаружения переполнения разрядной сетки в ЭВМ применяются модифицированные прямой, обратный и дополнительный коды. В этих кодах знак кодируется двумя разрядами, причем знаку "плюс" соответствует комбинация 00, а знаку "минус" - комбинация 11.
Правила сложения для модифицированных кодов те же, что и для обычных. Единица переноса из старшего знакового разряда в модифицированном дополнительном коде отбрасывается, а в модифицированном обратном коде передается в младший цифровой разряд.
Признаком переполнения служит появление в знаковом разряде суммы комбинации 01 при сложении положительных чисел (положительное переполнение) или 10 при сложении отрицательных чисел (отрицательное переполнение). Старший знаковый разряд в этих случаях содержит истинное значение знака суммы, а младший является старшей значащей цифрой числа. Для коррекции переполнения число нужно сдвинуть в разрядной сетке на один разряд вправо, а в освободившийся старший знаковый разряд поместить цифру, равную новому значению младшего знакового разряда. После корректировки переполнения мантиссы результата необходимо увеличить на единицу порядок результата.
Глава 4. Перевод чисел.
4.1 Представление двоичных чисел и перевод их в десятичные.
Совершенно очевидно, что двоичное число представляется последовательностью нулей и единиц – разрядов. Как и в любой позиционной системе, каждому разряду присвоен определенный вес – показатель степени основания системы. Веса первых 10 позиций представлены в таблице.
Веса первых десяти позиций двоичной системы счисления
Позиция |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Вес |
512 |
256 |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Образование |
В двоичной системе счисления даже сравнительно небольшие числа занимают много позиций.
Как и в десятичной системе, в двоичной системе счисления для отделения дробной части используется точка (двоичная точка). Каждая позиция слева от этой точки также имеет свой вес – вес разряда дробной части числа. Значение веса в этом случае равно основанию системы счисления (т.е. двойке), возведенному в отрицательную степень.
Получить десятичное число из двоичного чрезвычайно просто. Согласно формуле
для двоичной системы счисления получаем:
Пример иллюстрирует процесс получения десятичного числа из двоичного.
Перевод двоичного числа в десятичное
4.2 Преобразование десятичных чисел в двоичные
Перевод из двоичной системы в десятичную несколько сложнее. Рассмотрим несколько алгоритмов.
4.2.1 Метод деления
Другим методом является так называемый метод деления. Он применяется для преобразования целых чисел. Ниже приведен его алгоритм.
Разделим нацело десятичное число на двойку. Если есть остаток, запишем в младший разряд единицу, а если нет – нуль и снова разделим результат от первого деления. Повторим процедуру так до тех пор, пока окончательный результат не обнулиться.
Пример 4.3 Перевод десятичного числа в двоичное методом деления
2 |
|
||||||||
148 |
–74 |
2 |
|
||||||
1 |
74 |
–37 |
2 |
|
|||||
0 |
36 |
–18 |
2 |
|
|||||
1 |
18 |
–9 |
2 |
|
|||||
0 |
8 |
–4 |
2 |
|
|||||
1 |
4 |
–2 |
2 |
|
|||||
0 |
2 |
–1 |
2 |
|
|||||
0 |
0 |
0 |
|
||||||
1 |
¬ |
старший разряд |
|||||||
(10010101)2=(149)10 |
¬ ответ |
4.2.2 Метод умножения
И, наконец, метод умножения. Метод применяется для преобразования десятичных дробей (чисел меньших единицы).
Число умножается на 2, если результат ³ 1, то в старший разряд записывается единица, если нет, то нуль. Умножаем на 2 дробную часть результата и повторяем процедуру. И так далее до получения нужной степени точности или до обнуления результата.
Перевод десятичного числа в двоичное методом умножения
5.Постановка задачи.
Наиболее часто встречающиеся системы счисления это двоичная, десятеричная и шестнадцатеричная система счисления, восьмеричная система счисления встречается только в инженерных калькуляторах, практическое же применения её давно прекратилось. Итак, наша задача осуществить перевод целых чисел из одной системы счисления в другую. Для этого выберем двоичную, восьмеричную, десятеричную и шестнадцатеричную систему счисления.
6.Внешнее проектирование программы.
Для наглядности программу перевода лучше изобразить в виде ориентированного графа. Но если перевод осуществлять по этой схеме, то
SHAPE \* MERGEFORMAT
2 с.с. |
8 с.с. |
10 с.с. |
16 с.с. |
код программы будет громоздким. Так как будет множество алгоритмов перевода.
Чтобы упростить программу я решил переводить с двоичной, восьмеричной, десятеричной и шестнадцатеричной системы счисления в десятеричную систему. Из десятеричной системы перевод осуществляется в любую из предложенных.
SHAPE \* MERGEFORMAT
2.с.с |
8 с.с. |
10 с.с. |
16 с.с. |
10 с.с. |
2.с.с |
8 с.с. |
10 с.с. |
16 с.с. |
7.Математическая модель.
Для перевода из 2, 8, 10, 16 систем счисления в десятичную систему использую формулу:
n
AiMi,
i=0
где Ai – значение разрядного коэффициента i-го разряда, а М это основание системы счисления.
Пример:
Число 326 в десятичной системе можно записать так 3*102+2*101+6*100=326
Число 100110 в двоичной системе можно записать так 1*25+0*24+0*23+1*22+1*21+0*20=38.
Для перевода из десятичной системы счисления в 2, 8, 10, 16 используем алгоритм:
repeat
c := a mod e;
if (e = 16) and (c>9) then l:= l + chr(c+55) else l:= l + chr(c+48);
if a <> 0 then b := a div e;
if b<e then if (e = 16) and (b>9) then l:= l + chr(b+55) else l:= l + chr(b+48);
a := b;
until (b<e) or (a = 0).
В результате разработки программы я столкнулся с проблемой возведения целого числа в степень. Для этого мне пришлось разработать алгоритм возведения целого числа в степень.
var
i,y: integer;
begin
y:=1;
for i:= 1 to n do{Цикл задает число умножений}
y := y*x;{умножает число которое требуется возвести в цикл на Y и присваивает значение Y}
step := y;
end;
8.Кодирование и отладка программы.
Для кодирования программы используем среду программирования Borland Delphi 7 Enterprise edition. Для начала я сделал форму, в которой имеется строка для ввода информации две группы радио кнопок и кнопка «перевести».
Для работы выбраны библиотеки(uses)
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;
Типы данных:
type
TForm1 = class(TForm)
Edit1: TEdit;
RadioGroup1: TRadioGroup;
Label1: TLabel;
Button1: TButton;
RadioGroup2: TRadioGroup;
Label2: TLabel;
Label3: TLabel;
StatusBar1: TStatusBar;
procedure Edit1Change(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure RadioGroup2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
В разделе описания идентификаторов внесены следующие пункты:
Form1: TForm1; {форма окна}
vv1 : string; {переменная типа (целое число)string для ввода информации в строку «переводимое число»}
m,m1,ch1, i : integer;{переменные строкового типа(string) m, m1 используется для радиогрупп «Исходная система» и «Конечная система», ch1 вспомогательная переменная для перевода чисел, I переменная для циклов,}
implementation
{$R *.DFM}
В программе использованы следующие функции и процедуры.
1)Функция переводит данные из типа char в тип integer. Входные данные это переменная «a» типа char, выходные данные типа integer. Принцип работы программы заключается в том, что переменная «а» переводиться в ASCII код, и отнимается определённое число(55,48,87), вследствие чего получается число в десятичном виде. 55 - отнимается если символ «а» в диапазоне [‘A’..‘F’], 87 – если диапазон [‘a’..‘f’] и 48 – если диапазон [‘0’..‘9’].
function perevod0(a:char):integer;
var
c: integer;
begin
case a of
'A'..'F': c := ord(a) - 55;
'a'..'f': c := ord(a) - 87;
'0'..'9': c := ord(a) - 48;
end;
perevod0 := c;
end;
2) Функция переводит из десятичной системы в систему Е. «A» - переменная типа integer, служит для ввода десятичного числа. Переменная «е» типа integer служит для ввода системы счисления в которую нужно перевести число в моей программе e := m1(т.е. то что выбирается в радиогруппе «Конечная система »)
function perevod1(a:integer;e: integer): string;
var
l,j : string;
z,c,b,d: integer;
begin
repeat{Начало цикла}
c := a mod e;{с это остаток от деления десятичного числа на систему счисления }
if (e = 16) and (c>9) then l:= l + chr(c+55) else l:= l + chr(c+48);{Если система счисления шестнадцатеричная и остаток от деления больше 9, то число становиться от A до F, иначе число записывается от 0 до 9}
if a <> 0 then b := a div e;{Если а неравно нулю то b присваивается целочисленное деление а на е}
if b<e then if (e = 16) and (b>9) then l:= l + chr(b+55) else l:= l + chr(b+48);
{Если B меньше системы счисления, то если система счисления шестнадцатеричная и остаток от деления больше 9, то число становиться от A до F, иначе число записывается от 0 до 9}
a := b; {a присваивается b }
until (b<e) or (a = 0);{Цикл выполняется пока b меньше системы счисления (е) или десятичное число «а» станет равно 0}
for i:= length(l) downto 1 do{Цикл который идет назад т.е 3,2,1}
if (l[i]='0') and (z = 0) then else begin j:=j+ l[i]; z:=1 end;{Условный оператор переворачивает строку задом наперед}
perevod1 := j;
end;
3) Функция проверяет, введены ли числа в диапазоне [‘0’..‘9’, ‘A’..‘F’, ‘a’..‘f’], и включены ли радиогруппы. Vv1 – строка ввода типа string.
Вывод типа integer если ошибка равно 1 иначе 0.
function error1(vv1:string):integer;
begin
for i := 1 to length(vv1) do {цикл от одного до конца строки ввода вспомогательная переменная i}
if vv1 = '' then error1 :=1{Если строка ввода пустая то error1 присваивается 1}
else{иначе, если vv1[i]='0'..'9','a'..'f','A'..'F' не какого действия не происходит, иначе error1 присваивается 1}
begin
case vv1[i] of
'0'..'9','a'..'f','A'..'F':;
else error1 :=1;
end;
end;
end;
4) Функция возводит целое число в степень. x – это число в которое требуется возвести в степень, N – степень в которую надо возвести число вывод информации в типе integer.
function step(n:integer; x : integer): integer;
var
y: integer;
begin
y:=1;
for i:= 1 to n do{Цикл задает число умножений}
y := y*x;{умножает число которое требуется возвести в цикл на Y и присваивает значение Y}
step := y;
end;
5) Присваивает переменной vv1 входные данные.
procedure TForm1.Edit1Change(Sender: TObject);
begin
vv1:= edit1.text;
end;
6)Функция присваивает радиогруппе «Исходная система» значение.
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case radiogroup1.ItemIndex of { Определяет ItemIndex и присваивает m данные типа integer согласно условию}
0: m:=2;
1: m:=8;
2: m:=10;
3: m:=16;
end;
end;
7)Функция срабатывает на нажатие кнопки «Перевести». Переводит из 2,8,10,16-ой системы счисления в десятичную систему передаёт данные b выполняет функцию perevod0.Так же выводит полученный результат на экран.
procedure TForm1.Button1Click(Sender: TObject);
var
n : integer;
begin
if error1(vv1) <> 1 then {Если error1 не равно 1 то }
begin
ch1 :=0;
for i := 0 to length(vv1)-1 do {Начало цикла FOR}
begin n
n:=perevod0(vv1[length(vv1)-i])*step(i,m);{выполняется формула AiMi}
ch1 := ch1+n;
end;
label1.Caption := perevod1(ch1,m1);{На экран выводиться переведённое число}
end
else label1.Caption := 'ОШИБКА ВВОДА!!!'; {иначе на экран выводиться 'ОШИБКА ВВОДА!!!'; }
end;
8) Функция присваивает радио группе Исходная система значение. procedure TForm1.RadioGroup2Click(Sender: TObject);
begin
case radiogroup2.ItemIndex of{ Определяет ItemIndex и присваивает m данные типа integer согласно условию}
0: m1:=2;
1: m1:=8;
2: m1:=10;
3: m1:=16;
end;
end;
end.
9.Таблица тестов.
№ |
Входные данные |
Полученное число |
Примечание |
||
Переводимое число |
Исходная система |
Конечная система |
|||
1 |
1011 |
2 |
2 |
1011 |
Тесты предложенные на проверку правильности перевода |
2 |
1011 |
2 |
8 |
13 |
|
3 |
1011 |
2 |
10 |
11 |
|
4 |
1011 |
2 |
16 |
B |
|
5 |
17 |
8 |
2 |
1111 |
|
6 |
17 |
8 |
8 |
20 |
|
7 |
17 |
8 |
10 |
15 |
|
8 |
17 |
8 |
16 |
F |
|
9 |
254 |
10 |
2 |
11111110 |
|
10 |
254 |
10 |
8 |
376 |
|
11 |
254 |
10 |
10 |
254 |
|
12 |
254 |
10 |
16 |
FE |
|
13 |
adf34 |
16 |
2 |
10101101111100100000 |
|
14 |
adf34 |
16 |
8 |
2557464 |
|
15 |
adf34 |
16 |
10 |
712500 |
|
16 |
adf34 |
16 |
16 |
ADF34 |
|
17 |
212 |
16 |
10 |
530 |
|
18 |
ропл |
2 |
16 |
ОШИБКА ВВОДА!!! |
Тесты на ошибку ввода |
19 |
adf323g |
2 |
16 |
ОШИБКА ВВОДА!!! |
|
20 |
пустая строка |
8 |
10 |
ОШИБКА ВВОДА!!! |
10.Список литературы.
1. Кодирование информации (Двоичные коды). Березнюк Н. Т. Андрущенко А. Г. И др. Харьковю 1978.
2. Выгодский М.Я. Справочник по элементарной математике, М.: Государственное издательство технико-теоретической литературы, 1956.
3. Каган Б.М. Электронные вычислительные машины и системы, М.: Энергоатомиздат, 1985.
4. Майоров С.А., Кириллов В.В., Приблуда А.А., Введение в микроЭВМ, Л.: Машиностроение, 1988.
5. Фомин С.В. Системы счисления, М.: Наука, 1987.
6. Ролич Ч. Н. – От 2 до 16, Минск, «Высшая школа», 1981г.
7. Математическая энциклопедия. М: “Советская энциклопедия” 1985г.
8. Шауман А. М. Основы машинной арифметики. Ленинград, Издательство Ленинградского университета. 1979г.
9. Калабеков Б. А. Цифровые устройства и микропроцессорные системы. М: “Горячая линия - Телеком” 2000г.
10.Ворощук А. Н. Основы ЦВМ и программирования. М:”Наука” 1978г.
11.Алексенко А. Г. Микросхемотехника. М: ”Радио и связь” 1990г.