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

Целочисленные литералы в 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
