>а
содержит значение >-1
, a >b
значение >1
и обе переменные имеют тип >int
, ожидается результат >-1
. Но если переменная >а
имеет тип >int
, а переменная >b
— тип >unsigned
, то значение этого выражения будет зависеть от количества битов, занимаемых типом >int
на данной машине. На нашей машине результатом этого выражения оказалось >4294967295
.Упражнение 2.3. Каков будет вывод следующего кода?
>unsigned u = 10, u2 = 42;
>std::cout << u2 - u << std::endl;
>std::cout << u - u2 << std::endl;
>int i = 10, i2 = 42;
>std::cout << i2 - i << std::endl;
>std::cout << i - i2 << std::endl;
>std::cout << i - u << std::endl;
>std::cout << u - i << std::endl;
Упражнение 2.4. Напишите программу для проверки правильности ответов. При неправильных ответах изучите этот раздел еще раз.
2.1.3. Литералы
Такое значение, как >42
, в коде программы называется литералом (literal), поскольку его значение самоочевидно. У каждого литерала есть тип, определяемый его формой и значением.
Целочисленный литерал может быть в десятичной, восьмеричной или шестнадцатеричной форме. Целочисленные литералы, начинающиеся с нуля (>0
), интерпретируются как восьмеричные, а начинающиеся с >0x
или >0X
— как шестнадцатеричные. Например, значение >20
можно записать любым из трех следующих способов.
>20 // десятичная форма
>024 // восьмеричная форма
>0x14 // шестнадцатеричная форма
Тип целочисленного литерала зависит от его значения и формы. По умолчанию десятичные литералы считаются знаковыми, а восьмеричные и шестнадцатеричные литералы могут быть знаковыми или беззнаковыми. Для десятичного литерала принимается наименьший тип, >int
, >long
, или >long long
, подходящий для его значения (т.е. первый подходящий в этом списке). Для восьмеричных и шестнадцатеричных литералов принимается наименьший тип, >int
, >unsigned int
, >long
, >unsigned long
, >long long
или >unsigned long long
, подходящий для значения литерала. Не следует использовать литерал, значение которого слишком велико для наибольшего соответствующего типа. Нет литералов типа >short
. Как можно заметить в табл. 2.2, значения по умолчанию можно переопределить при помощи суффикса.
Хотя целочисленные литералы могут иметь знаковый тип, с технической точки зрения значение десятичного литерала никогда не бывает отрицательным числом. Если написать нечто, выглядящее как отрицательный десятичный литерал, например >-42
, то знак "минус" не будет частью литерала. Знак "минус" — это оператор, который инвертирует знак своего операнда (литерала).
Литералы с плавающей запятой включают либо десятичную точку, либо экспоненту, определенную при помощи экспоненциального представления. Экспонента в экспоненциальном представлении обозначается символом >E
или >е
:
>3.14159 3.14159Е0 0. 0e0 .001
По умолчанию литералы с плавающей запятой имеют тип >double
. Используя представленные в табл. 2.2 суффиксы, тип умолчанию можно переопределить.
Символ, заключенный в одинарные кавычки, является литералом типа >char
. Несколько символов, заключенных в парные кавычки, являются строковым литералом: