Обычно мы записываем числа в десятичной системе. Число 123 означает 1 сотню плюс 2 десятки плюс 3 единицы, или 1*100+2*10+3*1, или (используя символ л для обозначения степени) 1*10л2+2*10л1+3*10л0. Иногда вместо слова десятичный говорят: “База счисления равна десяти” (base-10). В данном случае число 10 означает, что в выражении 1*base^2+2*base^1+3*base^0 выполняется условие base==10. Существует много теорий, объясняющих, почему мы используем десятичную систему счисления. Одна из них апеллирует к естественным языкам: у нас на руках десять пальцев, а каждый символ, такой как 0, 1 и 2, представляющий собой цифру в позиционной системе счисления, в английском языке называется digit. Слово Digit в латинском языке означает палец.
Впрочем, иногда используются и другие системы счисления. Как правило, положительные целые числа в памяти компьютера представляются в двоичной системе счисления, т.е. база счисления равна 2 (значения 0 и 1 относительно легко представить с помощью физических состояний). Люди, сталкивающиеся с необходимостью решать задачи на низком уровне аппаратного обеспечения, иногда используют восьмеричную систему счисления (база равна 8), а при адресации памяти чаще используется шестнадцатеричная система (база равна 16).
Рассмотрим шестнадцатеричную систему счисления. Мы должны назвать шестнадцать значений от 0 до 15. Обычно для этого используются следующие символы: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, где A имеет десятичное значение 10, B — десятичное значение 11 и так далее:
А==10, В—11, С==12, D=13, Е==14, F==15 .
Теперь можем записать десятичное число 123 как 7B в шестнадцатеричной системе счисления. Для того чтобы убедиться в этом, обратите внимание на то, что в шестнадцатеричной системе счисления число 7B равно 7*16+11, что в десятичной системе счисления равно 123. И наоборот, шестнадцатеричное число 123 означает 1*16^2+2*16+3, т.е. 1*256+2*16+3, что в десятичной системе счисления равно 291. Если вы никогда не сталкивались с недесятичными представлениями целых чисел, то мы настоятельно рекомендуем вам поупражняться в преобразовании чисел из десятичной системы в шестнадцатеричную, и наоборот. Обратите внимание на то, что шестнадцатеричная цифра имеет очень простое соответствие со своим двоичным значением.
hex 0 1 2 3 4 5 6 7
binary 0000 0001 0010 0011 0100 0101 0110 0111
hex 8 9 А в с D Е F
binary 1000 1001 1010 1011 1100 1101 1110 1111
Это объясняет популярность шестнадцатеричной системы. В частности, значение байта просто выражается двумя шестнадцатеричными цифрами.
В языке C++ (к счастью) числа являются десятичными, если иное не указано явно. Для того чтобы сказать, что число является шестнадцатеричным, следует поставить префикс 0X (символ X происходит от слова hex), так что 123==0X7B и 0X123==291. Точно так же можно использовать символ x в нижнем регистре, поэтому 123==0x7B и 0x123==291. Аналогично мы можем использовать шестнадцатеричные цифры a, b, c, d, e и f в нижнем регистре. Например, 123==0x7b.
Восьмеричная система основана на базе счисления, равной восьми. В этом случае мы можем использовать только восемь восьмеричных цифр: 0, 1, 2, 3, 4, 5, 6, 7. В языке C++ числа в восьмеричной системе счисления начинаются с символа 0, так что число 0123 — это не десятичное число 123, а 1*8л2+2*8+3, т.е. 1*64+2*8+3 или (в десятичном виде) 83. И наоборот, восьмеричное число 83, т.е. 083, равно 8*8+3, т.е. десятичному числу 67. Используя систему обозначений языка C++, получаем равенства 0123==83 и 083==67.
Двоичная система основана на базе счисления, равной двум. В этой системе есть только две цифры: 0 и 1. В языке С++ невозможно непосредственно представить двоичные числа как литералы. В качестве литералов и формата ввода-вывода в языке С++ непосредственно поддерживаются только восьмеричные, десятичные и шестнадцатеричные числа. Однако двоичные числа полезно знать, даже если мы не можем явно представить их в тексте программы. Например, десятичное число 123 равно 1*2л6+1*2л5+1*2л4+1*2л3+0*2л2+1*2+1, т.е. 1*64+1*32+1*16+1*8+0*4+1*2+1, т.е. (в двоичном виде) 1111011.
|