Опубликован: 28.04.2014 | Доступ: свободный | Студентов: 990 / 89 | Длительность: 01:30:00
Специальности: Программист
Лекция 4:

Системы счисления

< Лекция 1 || Лекция 4
Аннотация: На этом уроке обсуждаются системы записи чисел, называемые системами счисления. Рассматриваются системы счисления, используемые в давние времена, - палочная система и римская система записи чисел. Показано, как изобретение цифры 0 позволило перейти к современным позиционным системам счисления. Если в обыденной жизни используется десятичная система счисления, то в мире компьютеров используется двоичная система, в которой существуют только две цифры 0 и 1. Подробности о двоичной системе и других позиционных системах и о том, как числа представляются в памяти компьютера, приведены в курсе "Информация и данные", предназначенном для самостоятельного изучения. Курс находится на сайте Интернет университета ИТ- "intuit.ru".

Системой счисления называется система записи чисел. Далеко не сразу сложилась современная система записи чисел, называемая десятичной позиционной системой счисления. Появление компьютеров потребовало применения для записи чисел в памяти компьютера двоичной системы счисления, более удобной для проведения вычислений появилась относительно появилась относительно недавно. По-видимому, первой системой счисления была так называемая "палочная" система, приспособленная для записи небольших натуральных чисел. Никаких дробных чисел тогда не знали, даже отрицательные целые числа появились достаточно поздно. Можно считать, что в палочной системе существует всего одна цифра – цифра 1, изображаемая в виде палочек. Натуральное число N записывалось N подряд идущими палочками. Понятно, что только небольшие числа удобно записать последовательностью палочек. Но эта система живет до сих пор и применяется особенно тогда, когда нужно многократно прибавлять к числу единицу, для этого достаточно дописывать к числу еще одну палочку. В десятичной системе в этом случае пришлось бы каждый раз стирать предыдущее число и записывать новое число.

Римляне уже в новой эре (две тысячи лет тому назад) пользовались так называемой Римской системой счисления. В этой системе существовала уже не одна цифра, что позволяло сделать запись числа более короткой в сравнении с палочной системой записи. Римляне ввели цифры: I (палочка) для записи числа 1, цифру V - для записи числа 5, цифру X - для записи числа 10, цифру L - для записи числа 50, цифру C - для записи числа 100, цифру D - для записи числа 500, цифру M - для записи числа 1000. В римской системе каждая цифра обозначает одно и то же число, независимо от позиции, в которой записана цифра. Максимальное число, которое можно записать в римской системе счисления, – это число MMMDCCCLXXXVIII – 3888. Правила записи довольно простые, - цифры M, C, X, I можно записывать подряд от одной до трех. Цифры D, L, V могут появляться в записи только один раз после старшей цифры. Цифры С, X, I могут появляться слева от старшей цифры, означая вычитание младшей цифры от старшей. Число 1946 в римской системе выглядит так: MCMXLVI.

Существенным прогрессом в записи чисел явилось изобретение позиционной системы счисления, где число, представленное цифрой, зависит как от цифры, так и от позиции, в которой стоит цифра. В записи числа 999, записанного в привычной для нас десятичной системе, младшая цифра - первая справа цифра 9 обозначает 9 единиц, вторая справа цифра 9 – девять десятков, третья цифра 9 – девять сотен. Великим изобретением, позволившим создать позиционную систему счисления, стало введение цифры 0. Изначально цифры вводились для обозначения некоторого количества предметов. Понять, что нужна цифра 0 для обозначения того, что предметов нет, было не просто.

Для записи чисел в позиционной системе счисления необходимы, по крайней мере, две цифры – 0 и 1, но цифр может быть, конечно, больше.

Число цифр - p, используемых в позиционной системе счисления, называется основанием системы счисления, а сама система называется p-ичной. В двоичной системе счисления с основанием p = 2 всего 2 цифры – {0, 1}. В троичной системе к ним добавляется цифра 2. В четверичной – цифра 3. В привычной для нас десятичной системе используется 10 цифр {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}.

В шестнадцатеричной системе к привычным цифрам добавляются следующие цифры: A – для обозначения числа 10, B – 11, C – 12, D – 13, E – 14, F – 15.

В данном уроке мы лишь кратко рассмотрим некоторые вопросы, связанные с представлением чисел в разных системах счисления. Подробное рассмотрение этой важной темы оставляется для самостоятельного изучения. Рекомендуется пройти мой курс "Информация и данные", расположенный на сайте Интернет университета ИТ (intuit.ru) – одном из лучших информационных ресурсов для обучения информационных технологий.

Первый урок этого курса называется "Правда ли что 2 * 2 = 4?". В этом уроке объясняется, что это утверждение, являющееся образцом тривиально истинного утверждения, на самом деле не всегда истинно. Оно истинно в некоторых системах счисления, но не во всех. В двоичной системе счисления нет цифры 2, в троичной и четверичной нет цифры 4, так что в этих системах счисления сама запись "2 * 2 = 4" некорректна.

Как же выглядит число 2 в двоичной системе, где нет цифры 2? Заметим, что 2 = 1 + 1. Цифра 1 – это старшая цифра в двоичной системе счисления. По правилам сложения в любых позиционных системах счисления, когда к старшей цифре прибавляется единица, то в этом разряде записывается 0, а 1 переносится в следующий разряд. Поэтому в двоичной системе справедлива следующая запись:

12 +12 = 102 = 210

Нижние индексы указывают систему счисления, в которой записано соответствующее число. Утверждение "дважды два равно 4" в двоичной системе выглядит так:

102 * 102 = 1002

В троичной и четверичной системе цифра 2 присутствует, но цифры 4 нет. Поэтому утверждение выглядит так:

23 * 23 = 113;	24 * 24 = 104

Обобщая приведенные примеры, нетрудно понять, что справедливо следующее утверждение: в любой позиционной системе счисления число 10 равно основанию системы счисления. В двоичной системе 10 задает число 2, в троичной – 3, в шестнадцатеричной – 16.

Рассмотрим на примере, каково десятичное значение числа N, например, числа 111, записанного в разных системах счисления. В привычной для нас десятичной системе

111 = 1 * 100 + 1 * 101 + 1 * 102

В двоичной системе представление числа такое же, только 10p теперь равно 2 - основанию системы, так что:

1112 = 1 * 20 + 1 * 21 + 1 * 22 = 7

В шестнадцатеричной системе 10p равно 16, так что;

11116 = 1 * 160 + 1 * 161 + 1 * 162 = 27310

Основное соотношение

Пусть pоснование системы счисления, D = {d0, d1, ... dp-1} – цифры системы счисления. Целое число N в этой системе счисления записано в виде последовательности цифр: cmcm-1...c0

Эта запись корректна, если для любого i : [0, m] ci принадлежат D, то есть запись содержит цифры системы p.

Эта запись означает, что

N = cm * pm + cm-1 * pm-1 + cm-2 * pm-2 + ... c1 * p1 + c0 (*)

Следствие

N = K * p + c0 (**)

Здесь Kцелое число, полученное отбрасыванием последней цифры числа N.

K = cmcm-1...c1 = cm * pm-1 + cm-1 * pm-2 + cm-2 * pm-3 + ... + c2 * p1 + c1

Алгоритм перевода в десятичную систему

Если дана запись числа в системе с основанием p, то соотношение * позволяет вычислить десятичное значение числа N.

Выше приведенный пример записи числа 111 в разных системах счисления демонстрирует применение алгоритма перевода.

Алгоритм перевода десятичного числа в систему с другим основанием

Над десятичными целыми числами определены две операцииделение нацело и остаток от деления нацело. В языке C# эти операции обозначаются знаками / и %.

Учитывая соотношение (**), операции взятия остатка от деления нацело числа N на основание системы счисления p позволяет получить последнюю цифру c0 в записи числа N в системе с основанием p. Операция деления нацело позволяет отрезать последнюю уже найденную цифру. Повторяя этот процесс можно получить все цифры в записи числа N в системе с основанием p. Запись этого алгоритма может выглядеть так:

String Np = ""; //Строка, представляющая запись числа N в системе с основанием p
ПОКА( N != 0)
{
	Получить очередную цифру в записи числа N в системе с основанием p:
		Digit = N % p;
	Отрезать цифру:
		N = N / p;
	Присоединить цифру Digit к строке Np:
		Np = Digit + Np;
}

Приведем пример. Переведем десятичное число 111 в шестнадцатеричную систему.

Np – пустая строка;	 N = 111 (не равно 0) 
Digit = 111 % 16 = 15 (цифра F в шестнадцатеричной системе
N = N / 16 = 6; 
Np = F;
N = 6 (не равно 0)
Digit = 6 % 16 = 6 (цифра 6 в шестнадцатеричной системе)
N = 6 / 16 = 0; 
Np = 6F;
N = 0

Процесс перевода закончен. 11110 = 6F16

Не расписывая подробно приведем результат перевода числа 111 в двоичную систему:

11110 =11011112

Представление чисел в памяти компьютера

Поговорим вначале об единицах измерения памяти. Минимальной единицей является память размера в один бит. Один бит может хранить одну цифру двоичной системы – 0 либо 1. Байт - это память, содержащая 8 бит. В одном байте может храниться двоичное слово, содержащее 8 двоичных цифр. Число различных двоичных слов, хранимых в одном байте, равно 28 = 256 от 00000000 до 11111111.

Память большого размера может измеряться в таких единицах, как килобайт (Кб), мегабайт (Мб), гигабайт (Гб), терабайт (Тб).

В программировании, где основной системой счисления является двоичная система, роль тысячи - числа 103 играет близкое к тысяче число 210 = 1024, задаваемое степенью основания двоичной системы.

1 Кб = 210 байта; 1 Мб = 210 Кб = 220 байта; 1 Гб = 210 Мб = 230 байта; 1 Тб = 210 Гб = 240 байта;

Мы видели, что в одном байте может храниться 28 = 256 различных двоичных слов. Справедливо общее утверждение – в памяти размера N бит можно хранить 2N двоичных слов. Поскольку двоичное слово можно рассматривать как запись целого числа в двоичной системе счисления, то не возникает никаких проблем для хранения в памяти целых чисел. Для хранения в памяти компьютера целого числа типа int отводится память размера 4 байта = 32 бита. Поскольку целые числа могут быть как положительными, так и отрицательными, то первый бит отводится для хранения знака числа (0 – число положительное, 1 – отрицательное), а следующие 31 бит хранят значение числа. Такая память позволяет хранить числа из интервала [-231 - +231-1].

А как хранятся в памяти компьютера числа типа double, имеющие целую и дробную часть? Ранее говорилось, что такие числа можно представить в виде: 0,q *10p, где qмантисса числа, а p – десятичный порядок. Мантисса и порядок – это целые числа, поэтому никаких проблем не возникает с их хранением. Для хранения числа типа double отводится память в 8 байтов = 64 бита. В этой памяти 55 бит отводится для хранения мантиссы числа, а 9 бит для хранения порядка числа.

Более подробно с деталями и примерами эта тема рассмотрена в уже упомянутом курсе "Информация и данные", предназначенном для самостоятельного изучения. В этом курсе показано также, как хранятся в памяти компьютера тексты и данные, представляющие разные виды информации, - графику, аудио и видео.

< Лекция 1 || Лекция 4
Дмитрий Лубченков
Дмитрий Лубченков
Николай Молдован
Николай Молдован