Integer constant
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
0xo la secuencia de caracteres0Xseguida 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
0bo la secuencia de caracteres0Bseguida 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
uo el carácterU) -
sufijo-largo
(el carácter
lo el carácterL) o el sufijo-largo-largo (la secuencia de caracteresllo la secuencia de caracteresLL) (desde C99) -
sufijo-entero-de-precisión-de-bits
(la secuencia de caracteres
wbo la secuencia de caracteresWB) (desde C23)
-
sufijo-sin-signo
(el carácter
|
Se pueden insertar comillas simples opcionales (
|
(since C23) |
Explicación
a
a
f
representan los valores decimales 10 a 15).
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ó.
| sufijo | bases decimales | otras bases |
|---|---|---|
| sin sufijo |
int
long
int
|
int
unsigned
int
|
u
o
U
|
unsigned
int
unsigned
long
int
|
unsigned
int
unsigned
long
int
|
l
o
L
|
long
int
unsigned
long
int
(hasta C99)
|
long
int
unsigned
long
int
|
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
|