Суффикс u или U означает, что целочисленный литерал не имеет знака, т.е. имеет спецификатор unsigned (см. раздел 25.5.3), а суффикс l или L относит их к типу long
, например 10u
или 123456UL
.
A.2.1.1. Числовые системы
Обычно мы записываем числа в десятичной системе. Число 123
означает 1
сотню плюс 2
десятки плюс 3
единицы, или 1*100+2*10+3*1
, или (используя символ ^
для обозначения степени) 1*10^2+2*10^1+3*10^0
. Иногда вместо слова 1*base^2+2*base^1+3*base^0
выполняется условие base==10
. Существует много теорий, объясняющих, почему мы используем десятичную систему счисления. Одна из них апеллирует к естественным языкам: у нас на руках десять пальцев, а каждый символ, такой как 0, 1 и 2, представляющий собой цифру в позиционной системе счисления, в английском языке называется
Впрочем, иногда используются и другие системы счисления. Как правило, положительные целые числа в памяти компьютера представляются в двоичной системе счисления, т.е. база счисления равна 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
и так далее:
A==10
, B==11
, C==12
, D==13
, E==14
, F==15
Теперь можем записать десятичное число 123
как 7B
в шестнадцатеричной системе счисления. Для того чтобы убедиться в этом, обратите внимание на то, что в шестнадцатеричной системе счисления число 7B
равно 7*16+11
, что в десятичной системе счисления равно 123
. И наоборот, шестнадцатеричное число 123
означает 1*16^2+2*16+3
, т.е. 1*256+2*16+3
, что в десятичной системе счисления равно 291
. Если вы никогда не сталкивались с недесятичными представлениями целых чисел, то мы настоятельно рекомендуем вам поупражняться в преобразовании чисел из десятичной системы в шестнадцатеричную, и наоборот. Обратите внимание на то, что шестнадцатеричная цифра имеет очень простое соответствие со своим двоичным значением.
Это объясняет популярность шестнадцатеричной системы. В частности, значение байта просто выражается двумя шестнадцатеричными цифрами.
В языке C++ (к счастью) числа являются десятичными, если иное не указано явно. Для того чтобы сказать, что число является шестнадцатеричным, следует поставить префикс 0X
(символ X
происходит от слова 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
.
A.2.2. Литералы с плавающей точкой
.
), показатель степени (например, e3
) или суффикс, обозначающий число с плавающей точкой (d
или f
). Рассмотрим примеры.
123 // int (нет десятичной точки, суффикса или показателя степени)
123. // double: 123.0
123.0 // double