Namespaces
Variants

Integer literal

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Permite que los valores de tipo entero se utilicen directamente en expresiones.

Contenidos

Sintaxis

Un literal entero tiene la forma

decimal-literal integer-suffix  (opcional) (1)
octal-literal integer-suffix  (opcional) (2)
hex-literal integer-suffix  (opcional) (3)
binary-literal integer-suffix  (opcional) (4) (desde C++14)

donde

  • decimal-literal es un dígito decimal distinto de cero ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ), seguido de cero o más dígitos decimales ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )
  • octal-literal es el dígito cero ( 0 ) seguido de cero o más dígitos octales ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 )
  • hex-literal es la secuencia de caracteres 0x o la secuencia de caracteres 0X seguida de uno o más dígitos hexadecimales ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , a , A , b , B , c , C , d , D , e , E , f , F )
  • binary-literal es la secuencia de caracteres 0b o la secuencia de caracteres 0B seguida de uno o más dígitos binarios ( 0 , 1 )
  • integer-suffix , si se proporciona, puede contener uno o ambos de los siguientes (si se proporcionan ambos, pueden aparecer en cualquier orden:
  • sufijo-sin-signo (el carácter u o el carácter U )
  • uno de
  • sufijo-largo (el carácter l o el carácter L )
  • long-long-suffix (la secuencia de caracteres ll o la secuencia de caracteres LL )
(desde C++11)
  • size-suffix (el carácter z o el carácter Z )
(desde C++23)

Se pueden insertar comillas simples opcionales ( ' ) entre los dígitos como separador; se ignoran al determinar el valor del literal.

(since C++14)

Un literal entero (como cualquier literal) es una expresión primaria .

Explicación

1) Literal entero decimal (base 10).
2) Literal entero octal (base 8).
3) Literal entero hexadecimal (base 16, las letras 'a' hasta 'f' representan los valores (decimales) 10 a 15).
4) Literal entero binario (base 2).

El primer dígito de un literal entero es el más significativo.

Ejemplo. Las siguientes variables se inicializan al mismo valor:

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C++14

Ejemplo. Las siguientes variables también se inicializan al mismo valor:

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

El tipo del literal

El tipo del literal entero es el primer tipo en el que el valor puede caber, de la lista de tipos que depende de qué base numérica y qué sufijo-entero se utilizó:

Sufijo Bases decimales Bases binarias, octales o hexadecimales
(sin sufijo)
  • int
  • long int
  • long long int (desde C++11)
  • int
  • unsigned int
  • long int
  • unsigned long int
  • long long int (desde C++11)
  • unsigned long long int (desde C++11)
u o U
  • unsigned int
  • unsigned long int
  • unsigned long long int (desde C++11)
  • unsigned int
  • unsigned long int
  • unsigned long long int (desde C++11)
l o L
  • long int
  • unsigned long int (hasta C++11)
  • long long int (desde C++11)
  • long int
  • unsigned long int
  • long long int (desde C++11)
  • unsigned long long int (desde C++11)
tanto l / L
como u / U
  • unsigned long int
  • unsigned long long int (desde C++11)
  • unsigned long int
  • unsigned long long int (desde C++11)
ll o LL
  • long long int (desde C++11)
  • long long int (desde C++11)
  • unsigned long long int (desde C++11)
tanto ll / LL
como u / U
  • unsigned long long int (desde C++11)
  • unsigned long long int (desde C++11)
z o Z
ambos z / Z
y u / U

Si el valor del literal entero que no tiene size-suffix (since C++23) es demasiado grande para caber en cualquiera de los tipos permitidos por la combinación de sufijo/base y el compilador admite un tipo entero extendido (como __int128 ) que puede representar el valor del literal, al literal se le puede asignar ese tipo entero extendido; de lo contrario, el programa está mal formado.

Notas

Las letras en los literales enteros no distinguen entre mayúsculas y minúsculas: 0xDeAdBeEfU y 0XdeadBEEFu representan el mismo número (una excepción es el long-long-suffix , que puede ser ll o LL , nunca lL o Ll ) (desde C++11) .

No existen literales de enteros negativos. Expresiones como - 1 aplican el operador unario de resta al valor representado por el literal, lo cual puede involucrar conversiones de tipo implícitas.

En C anterior a C99 (pero no en C++), los valores decimales sin sufijo que no caben en long int pueden tener el tipo unsigned long int .

Cuando se utiliza en una expresión de control de #if o #elif , todas las constantes enteras con signo actúan como si tuvieran tipo std::intmax_t y todas las constantes enteras sin signo actúan como si tuvieran tipo std::uintmax_t .

(since C++11)

Debido al maximal munch , los literales enteros hexadecimales que terminan en e y E , cuando van seguidos de los operadores + o - , deben separarse del operador con espacios en blanco o paréntesis en el código fuente:

auto x = 0xE+2.0;   // error
auto y = 0xa+2.0;   // OK
auto z = 0xE +2.0;  // OK
auto q = (0xE)+2.0; // OK

De lo contrario, se forma un único token de número de preprocesamiento no válido, lo que provoca que el análisis posterior falle.

Macro de prueba de características Valor Estándar Característica
__cpp_binary_literals 201304L (C++14) Literales binarios
__cpp_size_t_suffix 202011L (C++23) Sufijos literales para std::size_t y su versión con signo

Ejemplo

#include <cstddef>
#include <iostream>
#include <type_traits>
int main()
{
    std::cout << 123 << '\n'
              << 0123 << '\n'
              << 0x123 << '\n'
              << 0b10 << '\n'
              << 12345678901234567890ull << '\n'
              << 12345678901234567890u << '\n'; // el tipo es unsigned long long
                                                // incluso sin el sufijo long long
//  std::cout << -9223372036854775808 << '\n'; // error: el valor
               // 9223372036854775808 no cabe en signed long long, que es el
               // tipo más grande permitido para literales enteros decimales sin sufijo
    std::cout << -9223372036854775808u << '\n'; // el menos unario aplicado a un valor
               // sin signo lo resta de 2^64, esto da 9223372036854775808
    std::cout << -9223372036854775807 - 1 << '\n'; // forma correcta de calcular
                                                   // el valor -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
}

Salida:

123
83
291
2
12345678901234567890
12345678901234567890
9223372036854775808
-9223372036854775808

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
CWG 2698 C++23 un literal entero con size-suffix podría tener un tipo entero extendido mal formado si es demasiado grande

Referencias

  • Estándar C++23 (ISO/IEC 14882:2024):
  • 5.13.2 Literales enteros [lex.icon]
  • Estándar C++20 (ISO/IEC 14882:2020):
  • 5.13.2 Literales enteros [lex.icon]
  • Estándar C++17 (ISO/IEC 14882:2017):
  • 5.13.2 Literales enteros [lex.icon]
  • Estándar C++14 (ISO/IEC 14882:2014):
  • 2.14.2 Literales enteros [lex.icon]
  • Estándar C++11 (ISO/IEC 14882:2011):
  • 2.14.2 Literales enteros [lex.icon]
  • Estándar C++98 (ISO/IEC 14882:1998):
  • 2.13.1 Literales enteros [lex.icon]

Véase también

literales definidos por el usuario (C++11) literales con sufijo definido por el usuario
Documentación de C para constantes enteras