Различные системы счисления отличаются не только базовым набором чисел, но и основными концепциями, которые лежат в их основе. Взять, например, систему счисления, которая использовалась древними римлянами: она довольно трудна для восприятия, в ней очень сложно производить вычисления и невозможно представить 0. Данная система неудобна даже для человека,не говоря уж о том, чтобы научить компьютер «понимать» ее.
Десятичная система, которую мы используем всю жизнь, относится к классу так называемых позиционных систем счисления, в которых число А может быть представлено в виде:
A=a*Zn+a*Zn-1+…+a*Z1+a*Z0
Здесь a — это цифры числа, a Z — основание системы счисления, в нашем случае — 10. Например, число 1234 можно представить так:
1234 = 1*103 + 2*102 + 3*101 + 4*100
«Вес» каждой цифры определяется позицией цифры в числе и равен степени основания, соответствующей ее позиции.
При работе с различными системами счисления мы будем записывать само число в скобках, а за скобками — основание системы. Например, если написать просто число 1100, то не понятно, в какой системе оно записано — это может быть одна тысяча сто, а может быть 12, если число записано в двоичной системе. А если представить число в виде (1100)2, то сразу все становится на свои места: число записано в двоичной системе. Кстати, двоичная система тоже является позиционной, поэтому число 1100 в двоичной системе мы можем представить так:
(1100)2 = 1*23 + 1*22+ 0*21 + 0*20
После сложения 8+4 мы получим, что (1100)2 равно 12. Как видите, все точно так же, как и с десятичной системой. Обратите внимание, что для представления числа 12 в двоичной системе использованы только четыре разряда. Наибольшее число, которое можно записать четырьмя двоичными цифрами, равно 15, потому что (1111) 2 = 1* 8 + 1* 4 + 1* 2 + 1*1 = 15. Давайте рассмотрим первые 16 чисел в таблице систем счисления:
Числа растут равномерно, и нетрудно предположить, что 16 будет представлено в двоичной системе как (10000)2.
Восьмеричная система счисления (по основанию 8) состоит из большего количества цифр — из восьми (от 0 до 7). Преобразование из этой системы в десятичную систему полностью аналогично преобразованию из двоичной системы, например:
(77)8 = 7*81 + 7*81
Восьмеричная система счисления использовалась в очень популярных ранее 8-битных компьютерах ATARI, ZX Spectrum и др. Позже она была заменена шестнадцатеричной системой, которая также будет рассмотрена ниже.
В шестнадцатеричной системе цифрами представлены только первые 10 чисел, а для представления остальных 5 чисел используются символы A-F:
А = 10, В = 11, С = 12, D = 13, Е = 14, F = 15
Представим, как изменяется наш возраст в шестнадцатеричной системе: вы получили свой паспорт в 10 лет и стали совершеннолетним в 12 лет. Для шестнадцатеричной системы сохраняются те же принципы преобразования:
Число (524D)16 = 5*163 + 2*162 + 4*161 + 13*160 =
= 20 480 + 512 + 64 + 13 = 21 069
Число (DEAD) 16 = 13*163 + 14*162 + 10*161 + 13*160 = 57 005
Число (DEADBEEF)16 = 13*167 + 14*166 + 10*165 + 13*164 +
+ 11*163 + 14*162 + 14*161 + 15*160 = 3 735 928 559
Число (С001)16 = 12*163 + 0*162 + 0*161 + 1*160 = 49 153
Перевод систем счисления
Итак, мы видим на примерах как преобразовывать любое число, представленное в двоичной, восьмеричной и шестнадцатеричной системах, в десятичную систему.
А теперь займемся обратным преобразованием — из десятичной системы в систему с основанием 2. Для обратного преобразования мы должны делить наше число на 2 и записывать остатки от деления до тех пор, пока частное от предыдущего деления не станет равно 0. Например, преобразуем 14 в двоичную систему:
14/2 = 7 остаток 0
7/2 = 3 остаток 1
3/2 = 1 остаток 1
1/2 = 0 остаток 1
Мы завершили процесс деления, когда последнее частное стало равно 0. Теперь запишем все остатки подряд от последнего к первому, и мы получим число в двоичной системе — (1110)2.
Рассмотрим еще один пример — преобразование числа 13 в двоичную систему:
13/2 — 6 остаток 1
6/2 = 3 остаток 0
3/2 = 1 остаток 1
1/2 = 0 остаток 1
Как и в прошлом случае, мы делили до тех пор, пока частное не стало равно 0. Если записать остатки снизу вверх, мы получим двоичное число (1101)2.
А теперь потренируемся с шестнадцатеричной системой — преобразуем число 123456 в эту систему:
123456/16 = 7716 остаток 0
7716/16 = 482 остаток 4
482/16 = 30 остаток 2
30/16 = 1 остаток 14 = Е
1/16 = 0 остаток 1
После записи всех остатков получим, что число 123 456 = (1Е240)16.
Запись со скобками и нижним индексом в тексте программы неудобна, по этому обычно используют следующие обозначения для записи чисел в различных системах счисления:
- Запись шестнадцатеричного числа начинается с Ох или $0 либо заканчивается символом «h». Если первая цифра шестнадцатеричного числа — символ A-F, то перед таким числом нужно обязательно написать 0, чтобы компилятор понял, что перед ним число, а не идентификатор, например, ODEADh. Таким образом, записи 0x1234, $01234 и 01234h (TASM понимает только такую запись 01234h) представляют число(1234)16 .
- Десятичные числа могут записываться без изменений либо они заканчиваться постфиксом «d». Например, 1234 и 1234d представляют число(1234)10.
- Двоичные цифры должны заканчиваться постфиксом «b», например, 1100b — это (1100)2.
- Восьмеричные цифры заканчиваются на «q»: 12q — это (12)8.