Namespaces
Variants

Integer constant

From cppreference.net

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

Contenidos

Sintaxis

Una constante entera es una expresión no lvalue de la forma

decimal-constant integer-suffix  (opcional) (1)
octal-constant integer-suffix  (opcional) (2)
hex-constant integer-suffix  (opcional) (3)
binary-constant integer-suffix  (opcional) (4) (desde C23)

donde

  • decimal-constant 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-constant es el dígito cero ( 0 ) seguido de cero o más dígitos octales ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 )
  • hex-constant 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-constant 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 de los siguientes (excepto que el prefijo unsigned puede combinarse con uno de los otros; si se usan dos sufijos pueden aparecer en cualquier orden):
  • sufijo-sin-signo (el carácter u o el carácter U )
  • sufijo-largo (el carácter l o el carácter L ) o el sufijo-largo-largo (la secuencia de caracteres ll o la secuencia de caracteres LL ) (desde C99)
  • sufijo-entero-de-precisión-de-bits (la secuencia de caracteres wb o la secuencia de caracteres WB ) (desde C23)

Se pueden insertar comillas simples opcionales ( ' ) entre los dígitos como separador. El compilador las ignora.

(since C23)

Explicación

1) Constante entera decimal (base 10, el primer dígito es el más significativo).
2) Constante entera octal (base 8, el primer dígito es el más significativo).
3) Constante entera hexadecimal (base 16, el primer dígito es el más significativo, las letras a a f representan los valores decimales 10 a 15).
4) Constante entera binaria (base 2, el primer dígito es el más significativo).

Las siguientes variables se inicializan al mismo valor:

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C23

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

unsigned long long l1 = 18446744073709550592ull; // C99
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C23
unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C23
unsigned long long l4 = 184467'440737'0'95505'92LLU; // C23

El tipo de la constante entera

El tipo de la constante entera 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é integer-suffix se utilizó.

Tipos permitidos para constantes enteras
sufijo bases decimales otras bases
sin sufijo int

long int
unsigned long int (hasta C99)
long long int (desde C99)

int

unsigned int
long int
unsigned long int
long long int (desde C99)
unsigned long long int (desde C99)

u o U unsigned int

unsigned long int
unsigned long long int (desde C99)

unsigned int

unsigned long int
unsigned long long int (desde C99)

l o L long int

unsigned long int (hasta C99)
long long int (desde C99)

long int

unsigned long int
long long int (desde C99)
unsigned long long int (desde C99)

tanto l / L como u / U unsigned long int

unsigned long long int (desde C99)

unsigned long int

unsigned long long int (desde C99)

ll o LL long long int (desde C99) long long int (desde C99)

unsigned long long int (desde C99)

ambos ll / LL y u / U unsigned long long int (desde C99) unsigned long long int (desde C99)
wb o WB _BitInt ( N ) donde el ancho N es el N más pequeño mayor que 1 que puede acomodar el valor y el bit de signo (desde C23) _BitInt ( N ) donde el ancho N es el N más pequeño mayor que 1 que puede acomodar el valor y el bit de signo (desde C23)
ambos wb / WB y u / U unsigned _BitInt ( N ) donde el ancho N es el menor N mayor que 0 que puede contener el valor (since C23) unsigned _BitInt ( N ) donde el ancho N es el menor N mayor que 0 que puede contener el valor (since C23)

Si el valor de la constante entera es demasiado grande para caber en cualquiera de los tipos permitidos por la combinación de sufijo/base, no tiene sufijos wb , WB , uwb , o UWB (desde C23) y el compilador admite tipos enteros extendidos (como __int128 ), a la constante se le puede asignar el tipo entero extendido; de lo contrario, el programa está mal formado.

Notas

Las letras en las constantes enteras no distinguen entre mayúsculas y minúsculas: 0xDeAdBaBeU y 0XdeadBABEu representan el mismo número (una excepción es el long-long-suffix , que puede ser ll o LL , pero nunca lL o Ll ) (desde C99) .

No existen constantes enteras negativas. Expresiones como - 1 aplican el operador unario de resta al valor representado por la constante.

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 intmax_t y todas las constantes enteras sin signo actúan como si tuvieran tipo uintmax_t .

(desde C99)

Las constantes enteras pueden utilizarse en expresiones constantes enteras .

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

int x = 0xE+2;   // error
int y = 0xa+2;   // OK
int z = 0xE +2;  // OK
int q = (0xE)+2; // 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.

Ejemplo

#include <inttypes.h>
#include <stdio.h>
int main(void)
{
    printf("123 = %d\n", 123);
    printf("0123 = %d\n", 0123);
    printf("0x123 = %d\n", 0x123);
    printf("12345678901234567890ull = %llu\n", 12345678901234567890ull);
    // el tipo es de 64 bits (unsigned long long o posiblemente unsigned long)
    // incluso sin el sufijo long
    printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u );
    // printf("%lld\n", -9223372036854775808); // Error:
        // el valor 9223372036854775808 no cabe en signed long long, que
        // es el tipo más grande permitido para constantes enteras decimales sin sufijo
    printf("%llu\n", -9223372036854775808ull );
    // el menos unario aplicado a un valor sin signo lo resta de 2^64,
    // esto da 9223372036854775808 sin signo
    printf("%lld\n", -9223372036854775807ll - 1);
    // forma correcta de formar el valor con signo -9223372036854775808
}

Salida:

123 = 123
0123 = 83
0x123 = 291
12345678901234567890ull = 12345678901234567890
12345678901234567890u = 12345678901234567890
9223372036854775808
-9223372036854775808

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 6.4.4.1 Constantes enteras (p: 57-60)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.4.4.1 Constantes enteras (p: 45-46)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.4.4.1 Constantes enteras (p: 62-64)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 6.4.4.1 Constantes enteras (p: 54-56)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 3.1.3.2 Constantes enteras

Véase también

Documentación de C++ para Literal entero