Integer literal
Позволяет использовать значения целочисленного типа непосредственно в выражениях.
Содержание
СинтаксисЦелочисленный литерал имеет вид
где
Целочисленный литерал (как и любой литерал) является первичным выражением . Объяснение
1)
Десятичный целочисленный литерал (основание 10).
2)
Восьмеричный целочисленный литерал (основание 8).
3)
Шестнадцатеричный целочисленный литерал (основание 16, буквы
'a'
через
'f'
представляют значения (десятичные) от 10 до 15).
4)
Двоичный целочисленный литерал (основание 2).
Первая цифра целочисленного литерала является наиболее значимой. Пример. Следующие переменные инициализируются одинаковыми значениями: int d = 42; int o = 052; int x = 0x2a; int X = 0X2A; int b = 0b101010; // C++14 Пример. Следующие переменные также инициализируются тем же значением: unsigned long long l1 = 18446744073709550592ull; // C++11 unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14 unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C++14 unsigned long long l4 = 184467'440737'0'95505'92LLU; // C++14 Тип литералаТип целочисленного литерала — это первый тип из списка типов, в который может поместиться значение; этот список зависит от системы счисления и использованного суффикса целого числа:
Если значение целочисленного литерала которое не имеет суффикса размера(начиная с C++23) слишком велико, чтобы поместиться в любой из типов, разрешённых комбинацией суффикс/система счисления, и компилятор поддерживает расширенный целочисленный тип (например, Примечания
Буквы в целочисленных литералах нечувствительны к регистру:
Не существует целочисленных литералов отрицательного значения. Выражения вида - 1 применяют унарный оператор минус к значению, представленному литералом, что может включать неявные преобразования типов. В C до C99 (но не в C++), десятичные значения без суффикса, которые не помещаются в long int , могут иметь тип unsigned long int .
Из-за
максимального поглощения
, шестнадцатеричные целочисленные литералы, оканчивающиеся на
auto x = 0xE+2.0; // ошибка auto y = 0xa+2.0; // OK auto z = 0xE +2.0; // OK auto q = (0xE)+2.0; // OK В противном случае формируется единственная недопустимая лексема препроцессорного числа, что приводит к сбою дальнейшего анализа.
Пример
Запустить этот код
#include <cstddef> #include <iostream> #include <type_traits> int main() { std::cout << 123 << '\n' << 0123 << '\n' << 0x123 << '\n' << 0b10 << '\n' << 12345678901234567890ull << '\n' << 12345678901234567890u << '\n'; // тип unsigned long long // даже без суффикса long long // std::cout << -9223372036854775808 << '\n'; // ошибка: значение // 9223372036854775808 не помещается в signed long long, который является // наибольшим типом для десятичных целочисленных литералов без суффикса std::cout << -9223372036854775808u << '\n'; // унарный минус применён к беззнаковому // значению вычитает его из 2^64, получается 9223372036854775808 std::cout << -9223372036854775807 - 1 << '\n'; // правильный способ вычисления // значения -9223372036854775808 #if __cpp_size_t_suffix >= 202011L // C++23 static_assert(std::is_same_v<decltype(0UZ), std::size_t>); static_assert(std::is_same_v<decltype(0Z), std::make_signed_t<std::size_t>>); #endif } Вывод: 123 83 291 2 12345678901234567890 12345678901234567890 9223372036854775808 -9223372036854775808 Отчеты о дефектахСледующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.
Ссылки
Смотрите также
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||