Daily bit(e) C++. Целочисленные литералы

Добавлено 14 сентября 2026 в 01:59

Daily bit(e) C++ 102, сложные правила определения типа целочисленных литералов.

Daily bit(e) C++

Целочисленные литералы в C++ могут быть на удивление сложными, если вас интересует их тип. Тип определяется комбинацией указанного суффикса (если он есть), системы счисления (например, десятичной) и самого значения литерала.

Для любого значения выбирается первый (наименьший) тип, способный его вместить, из списка, определяемого суффиксом и системой счисления.

В случае десятичной системы счисления беззнаковые типы выбираются только при наличии суффикса 'u'. Для других систем счисления беззнаковый тип может быть выбран, даже если суффикс 'u' не указан. В любом случае наличие суффикса 'u' исключает возможность выбора знакового типа.

Суффикс размера ограничивает список потенциальных типов, требуя, чтобы выбранный тип имел как минимум указанный размер (например, 'long' или 'long long').

Альтернативой суффиксам служат макросы из заголовочного файла <cstdint>, которые позволяют оформить литерал так, чтобы он соответствовал типу 'std::(u)int_leastXX_t'.

#include <utility>
#include <cstdint>

// Тип с наименьшим рангом выбирается на основе размера;
// конкретный тип зависит от платформы.

// для десятичной записи без суффикса используется знаковый тип
auto a1 = 0;
// decltype(a1) == int

auto a2 = 3'000'000'000;
// decltype(a2) == long

// суффикс 'u' принудительно задает беззнаковый тип
auto a3 = 0u;
// decltype(a3) == unsigned

auto a4 = 5'000'000'000u;
// decltype(a4) == unsigned long

// для записи в недесятичной системе счисления
// беззнаковые типы могут быть выбраны даже без
// суффикса 'u'
auto a5 = 0x8000'0000; // INT_MAX + 1
// decltype(a5) == unsigned
  
  
// Знаковые целочисленные литералы
auto b1 = 0;
// decltype(b1) == int

auto b2 = 0L; // минимум long
// decltype(b2) == long

auto b3 = 0LL; // C++11, минимум long long
// decltype(b3) == long long

auto b4 = 0Z; // C++23, гарантированно std::ptrdiff_t
// decltype(b4) == std::ptrdiff_t

  
// Беззнаковые целочисленные литералы
auto c1 = 0U; // беззнаковый тип
// decltype(c1) == unsigned

auto c2 = 0UL; // беззнаковый тип, минимум long
// decltype(c2) == unsigned long

auto c3 = 0ULL; // C++11, беззнаковый тип, минимум long long
// decltype(c3) == unsigned long long

auto c4 = 0UZ; // C++23, гарантированно std::size_t
// decltype(c4) == std::size_t

  
// Макрос для целочисленного типа фиксированного размера из <cstdint>
auto d1 = UINT64_C(0); // C++11, гарантированно std::uint_least64_t
// decltype(d1) == std::uint_least64_t

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование