В современном мире для записи числовой информации используют позиционные системы счисления, в которых числа записываются с помощью ограниченного количества цифр, а фактический вес цифры в результирующем числе определяется не только ее значением, но и позицией, которую она занимает в записи числа. Вес соседних позиций отличается в M раз, где M – основание системы счисления.
Например, имеем запись числа
an... a3 a2 a1 a0
тогда его значение можно вычислить по следующей формуле
an*Mn +... + a3*M3 + a2*M2 + a1*M1 + a0*M0,
где an...a0 - цифры из записи числа.
Максимальное значение числа без знака, которое может быть представлено N разрядами позиционной системы счисления определяется как
MN - 1.
В общепринятой десятичной системе счисления для записи чисел используются десять цифр 0,1,2,3,4,5,6,7,8,9. Основание системы счисления – 10. Значение числа определяется так:
9721 (10) = 9*103 + 7*102 + 2*101 + 1*100
В вычислительной технике, кроме десятичной, широко используются двоичная, восьмеричная и шестнадцатеричная системы счисления.
|
|
Все данные внутри ЭВМ представлены в двоичной системе, поскольку в этом случае достаточно всего двух цифр, а электронные схемы, как правило, тоже имеют два различных состояния. Десятичная, восьмеричная и шестнадцатеричная системы используются при выводе информации для пользователя, недостающие цифры шестнадцатеричной системы счисления заменяются буквами A,B,C,D,E,F.
Приведем несколько примеров:
1010 (2) = 1*23 + 0*22 + 1*21 + 0*20 = 10 (10)
2701 (8) = 2*83 + 7*82 + 0*81 + 1*80 = 1473 (10)
F4A (16) = 15*162 + 4*161 + 10*160 = 3914 (10)
Для перевода чисел из десятичной системы счисления в любую другую нужно последовательно делить его на основание новой системы счисления, при этом остатки от каждого деления будут представлять собой цифры из записи числа в новой системе, например:
1473: 8 = 184 остаток 1
184: 8 = 23 остаток 0
23: 8 = 2 остаток 7 8
2: 8 = 0 остаток 2
---------------------------
1473 (10) = 2701 (8)
Для перевода чисел из десятичной системы счисления в двоичную используют так называемый "алгоритм замещения", состоящий из следующей последовательности действий:
1. Делим десятичное число А на 2. Частное Q запоминаем для следующего шага, а остаток a записываем как младший бит двоичного числа.
2. Если частное q не равно 0, принимаем его за новое делимое и повторяем процедуру, описанную в шаге 1. Каждый новый остаток (0 или 1) записывается в разряды двоичного числа в направлении от младшего бита к старшему.
3. Алгоритм продолжается до тех пор, пока в результате выполнения шагов 1 и 2 не получится частное Q = 0 и остаток a = 1.
Например, требуется перевести десятичное число 247 в двоичное. В соответствии с приведенным алгоритмом получим:
|
|
24710: 2 = 12310 |
24710 - 24610 = 1, остаток 1 записываем в МБ двоичного числа. |
12310: 2 = 6110 |
12310 - 12210 = 1, остаток 1 записываем в следующий после МБ разряд двоичного числа. |
6110: 2 = 3010 |
6110 - 6010 = 1, остаток 1 записываем в старший разряд двоичного числа. |
3010: 2 = 1510 |
3010 - 3010 = 0, остаток 0 записываем в старший разряд двоичного числа. |
1510: 2 = 710 |
1510 - 1410 = 1, остаток 1 записываем в старший разряд двоичного числа. |
710: 2 = 310 |
710 - 610 = 1, остаток 1 записываем в старший разряд двоичного числа. |
310: 2 = 110 |
310 - 210 = 1, остаток 1 записываем в старший разряд двоичного числа. |
110: 2 = 010, остаток 1 записываем в старший разряд двоичного числа. |
Таким образом, искомое двоичное число равно 111101112.
Для перевода чисел из десятичной системы счисления в шестнадцатеричную используют тот же "алгоритм замещения", что и при переводе из десятичной системы счисления в двоичную и восьмеричную, только в качестве делителя используют 16, основание шестнадцатеричной системы счисления:
1. Делим десятичное число А на 16. Частное Q запоминаем для следующего шага, а остаток a записываем как младший бит шестнадцатеричного числа.
2. Если частное q не равно 0, принимаем его за новое делимое и повторяем процедуру, описанную в шаге 1. Каждый новый остаток записывается в разряды шестнадцатеричного числа в направлении от младшего бита к старшему.
3. Алгоритм продолжается до тех пор, пока в результате выполнения шагов 1 и 2 не получится частное Q = 0 и остаток a меньше 16.
Например, требуется перевести десятичное число 32767 в шестнадцатеричное. В соответствии с приведенным алгоритмом получим:
3276710: 16 = 204710 |
3276710 - 3275210 = 15, остаток 15 в виде F записываем в МБ шестнадцатеричного числа. |
204710: 16 = 12710 |
204710 - 203210 = 15, остаток 15 в виде F записываем в следующий после МБ разряд шестнадцатеричного числа. |
12710: 16 = 710 |
12710 - 11210 = 15, остаток 15 в виде F записываем в старший разряд шестнадцатеричного числа. |
710: 16 = 010, остаток 7 записываем в старший разряд шестнадцатеричного числа. |
Таким образом, искомое шестнадцатеричное число равно 7FFF16.
Перевод чисел из двоичной системы счисления в восьмеричную или шестнадцатеричную осуществляется путем разбиения двоичного числа на триады или тетрады и записи вместо них соответствующей восьмеричной или шестнадцатеричной цифры. Например:
0101 1011 1111 1100 (2) = 5BCF (16)
5 11=B 15=F 12=C
0 101 101 111 111 100 (2) = 55774 (8)
5 5 7 7 4
Для перевода двоичного числа в десятичное необходимо это число представить в виде суммы произведений степеней основания двоичной системы счисления на соответствующие цифры в разрядах двоичного числа.
0101101111111100(2)=(0·215)+(1·214)+(0·213)+(1·212)+(1·211)+(0·210)+(1·29)+(1·28)+(1·27)+(1·26)+(1·25)+(1·24)+(1·23)+(1·22)+(0·21)+(0·20)=
=0+16384+0+4096+2048+0+512+256+128+64+32+16+8+4+0+0= 23548 (10)
Из этого примера видно, что десятичная система счисления более компактно отображает числа – 5 цифр (т.е. бит) вместо 16 цифр в двоичной системе счисления.
В любой системе счисления нужно уметь представлять не только целые числа, но и дробные. С математической точки зрения это ординарная задача, которая давно решена. Однако с точки зрения компьютерной техники это далеко не тривиальная проблема, во многом связанная с архитектурой компьютера. Ресурсы компьютеров не бесконечны, и основной трудностью является представление периодических и непериодических дробей. Следовательно, такие дроби следует округлять, задавать класс точности участвующих (и могущих появиться в результате вычислений!) чисел без потери точности вычислений, а также следить за тем, чтобы потеря точности не произошла при переводе чисел из одной системы счисления в другую. Особенно важно аккуратно производить вычисления при операциях с плавающей точкой.
Запишем формулу представления дробного числа в позиционной системе счисления:
A p = a n-1 · p n-1+ a n-2 · p n-2 +...+ a 1 · p 1+ a 0 · p 0 + a -1 · p -1+ a -2 · p -2 +... + a -m · p -m.
|
|
В случае десятичной системы счисления получим:
24,732 = 2·101+4·100+7·10-1+3·10-2
Перевод дробного числа из двоичной системы счисления в десятичную производится по следующей схеме:
101101,1012 = 1·2 5+ 0·2 4+ 1·2 3+ 1·2 2+ 0·2 1+ 1·2 0+ 1·2 -1+ 0·2 -2+ 1·2 -3= 45,625
Перевод дробного числа из десятичной системы счисления в двоичную осуществляется по следующему алгоритму:
· Сначала переводится целая часть десятичной дроби в двоичную систему счисления;
· Затем дробная часть десятичной дроби умножается на основание двоичной системы счисления;
· В полученном произведении выделяется целая часть, которая принимается в качестве значения первого после запятой разряда числа в двоичной системе счисления;
· Алгоритм завершается, если дробная часть полученного произведения равна нулю или если достигнута требуемая точность вычислений. В противном случае вычисления продолжаются с предыдущего шага.
Пример: Требуется перевести дробное десятичное число 206,116 в дробное двоичное число.
Перевод целой части дает 20610=110011102 по ранее описанным алгоритмам; дробную часть умножаем на основание 2, занося целые части произведения в разряды после запятой искомого дробного двоичного числа:
.116 • 2 = 0. 232
.232 • 2 = 0. 464
.464 • 2 = 0. 928
.928 • 2 = 1. 856
.856 • 2 = 1. 712
.712 • 2 = 1. 424
.424 • 2 = 0. 848
.848 • 2 = 1. 696
.696 • 2 = 1. 392
.784 • 2 = 0. 784
И т.д.
Получим: 20610=11001110,00011101102
При обработке данных и вычислениях одной из наиболее часто встречающихся задач является перевод чисел из одной системы счисления в другую. Рассмотрим простейшие алгоритмы перевода положительных чисел из двоичной системы в восьмеричную и шестнадцатеричную.
Пусть требуется перевести двоичное число 101011011001101101111001010110010112 в восьмеричную систему счисления. Для этого следует разбить это двоичное число на триады, начиная с младшего бита (МБ). Получим:
010 101 101 100 110 110 111 100 101 011 001 0112
2 5 5 4 6 6 7 4 5 3 1 38
Если старшая триада не заполнена до конца, следует дописать в ее старшие разряды нули, как в нашем случае. После этого необходимо заменить двоичные триады, начиная с младшей, на числа, равные им в восьмеричной системе:
|
|
000 – 0
001 – 1
010 – 2
011 – 3
100 – 4
101 – 5
110 – 6
111 – 7
Таким образом, 101011011001101101111001010110010112 = 2554667453138
Аналогично поступаем при переводе чисел из двоичной системы счисления в шестнадцатеричную, но разбиение двоичного числа производим на тетрады. Для примера будем использовать то же двоичное число, что и при переводе в восьмеричную систему счисления:
0101 0110 1100 1101 1011 1100 1010 1100 10112
5 6 C D B C A C B16
0000 – 0 0001 – 1 0010 – 2 0011 – 3 | 0100 – 4 0101 – 5 0110 – 6 0111 – 7 | 1000 – 8 1001 – 9 1010 – A 1011 – B | 1100 – C 1101 – D 1110 – E 1111 – F |
Заменяя двоичные тетрады на их шестнадцатеричные значения, получим искомое шестнадцатеричное число: 101011011001101101111001010110010112 = 56CDBCACB16
Пусть требуется перевести восьмеричное число 24738 в двоичное число. Поскольку 28 = 0102, 48 = 1002, 78 = 1112... Таким образом, 24738 = 101001110112
Двоичная система | Восьмеричная система | Десятичная система | Шестнадцатеричная система |
A | |||
B | |||
C | |||
D | |||
E | |||
F | |||
Следует помнить, что восьмеричное число кодируется тремя битами, и выписывать триады нужно полностью. Исключением из этого правила может служить только старшая триада, в которой старший бит (СБ) равен нулю.
Сложнее обстоит дело при переводе чисел из восьмеричной системы в шестнадцатеричную. Обычно вначале переводят восьмеричное число в двоичное, а затем уже в шестнадцатеричное. Для рассмотренного выше примера имеем:
24738 = 101001110112 = 0101 0011 10112 = 53B16
Алгоритм перевода чисел из шестнадцатеричной системы счисления двоичную крайне прост. Необходимо только заменить каждую цифру шестнадцатеричного числа ее эквивалентом в двоичной системе счисления (в случае положительных чисел). Отметим только, что каждое шестнадцатеричное число следует заменять двоичным, дополняя его до 4 разрядов (в сторону старших разрядов).
Пусть требуется перевести шестнадцатеричное число F116 в двоичное число. Воспользовавшись таблицей соответствия, получим:
F116 = 111100012.
Этот пример иллюстрирует тот факт, что следует дополнять младшие разряды до 4 разряда в двоичном числе. Естественно, дополнять старший разряд двоичного числа до 4 старших битов нулями не имеет смысла, другими словами пишут
1F16 = 111112, а не 000111112
При переводе чисел из шестнадцатеричной в восьмеричную систему счисления:
– шестнадцатеричное число переводят в двоичное;
– разбивают его на триады, начиная с младшего бита;
– заменяют триады соответствующими им эквивалентами в восьмеричной системе.
1F16 = 111112 = 011 1112 = 378
F116 = 111100012 = 011 110 0012 = 3618
Непосредственное преобразование чисел из шестнадцатеричной системы счисления в восьмеричную требует выполнения арифметических действий в этой системе счисления. Программная реализация вышеприведенного алгоритма проще и надежнее, поскольку при выполнениях операций деления неизбежно возникают дробные числа и переполнение разрядной сетки, необходимость округления, и, как следствие, потеря точности, не говоря уже о скорости выполнения компьютером такого типа алгоритмов.
Целые беззнаковые числа хранятся в памяти ЭВМ в виде двоичных чисел, занимающих N двоичных разрядов. Диапазон чисел в этом случае от 0 до 2N-1. Целые числа со знаком, записанные в те же N двоичных разрядов будут иметь диапазон от -2(N-1) до 2(N-1)-1.
Действительные числа хранятся в памяти ЭВМ в специальном формате с плавающей точкой. При этом часть двоичных разрядов ячейки хранит мантиссу числа со знаком, а другая часть – порядок числа. Диапазон действительных чисел определяется количеством двоичных разрядов, отведенных под порядок, а их точность – количеством разрядов под мантиссу.
Символы представлены в ЭВМ в виде соответствующих целочисленных кодов, хранимых в двоичной форме. Обычно под символ отводится один байт памяти, поэтому количество различных символов равно 28-1=255.
УПРАЖНЕНИЯ
1. Представить десятичные числа в двоичной, восьмеричной, шестнадцатеричной и двоично-десятичной системах счисления:
2. Представить двоичные числа в десятичной системе счисления:
3. Представить восьмеричные числа в десятичной системе счисления:
4. Представить шестнадцатеричные числа в десятичной системе счисления:
A5FFB | B2FCD | 3AE5C | 1FBCA | F2EBD |
5. Вычислить:
(F5BCD-10011011)+(BABA+DEDA)-(10011011*1101)+327Q-65Q
6. Представить десятичные дробные числа в десятичной системе счисления:
0,3157 | 0,6725 | 3,14159 | 5,9876 | 10,3647 |
7. Представить десятичные отрицательные числа в десятичной системе счисления:
-378 | -567 | -789 | -198 | -689 |
8. Вычислить и представить в двоичной системе:
0,7*(-19+(-17)); 0,3*(8-(-7)); 0,9*(12+(-4))