En informática , un literal entero es un tipo de literal para un número entero cuyo valor se representa directamente en el código fuente . Por ejemplo, en la sentencia de asignación x = 1
, la cadena 1
es un literal entero que indica el valor 1, mientras que en la sentencia x = 0x10
la cadena 0x10
es un literal entero que indica el valor 16, que se representa 10
en hexadecimal (indicado por el 0x
prefijo).
Por el contrario, en x = cos(0)
, la expresión cos(0)
se evalúa como 1 (como el coseno de 0), pero el valor 1 no está incluido literalmente en el código fuente. Más simplemente, en x = 2 + 2,
la expresión 2 + 2
se evalúa como 4, pero el valor 4 no está incluido literalmente. Además, en x = "1"
es "1"
un literal de cadena , no un literal entero, porque está entre comillas. El valor de la cadena es 1
, que resulta ser una cadena entera, pero este es un análisis semántico del literal de cadena: a nivel sintáctico "1"
es simplemente una cadena, no diferente de "foo"
.
Reconocer una cadena (secuencia de caracteres en el código fuente) como un literal entero es parte de la fase de análisis léxico (lexing), mientras que evaluar el literal a su valor es parte de la fase de análisis semántico . Dentro del analizador léxico y la gramática de frases, la clase de token a menudo se denota integer
, donde la minúscula indica una clase de token de nivel léxico, en oposición a la regla de producción de nivel de frase (como ListOfIntegers
). Una vez que una cadena ha sido analizada léxicamente (tokenizada) como un literal entero, su valor no se puede determinar sintácticamente (es solo un entero), y la evaluación de su valor se convierte en una cuestión semántica.
Los literales enteros generalmente se analizan mediante expresiones regulares , como en Python . [1]
Al igual que con otros literales, los literales enteros generalmente se evalúan en tiempo de compilación, como parte de la fase de análisis semántico. En algunos casos, este análisis semántico se realiza en el analizador léxico, inmediatamente después de reconocer un literal entero, mientras que en otros casos esto se pospone hasta la etapa de análisis, o hasta después de que se haya construido completamente el árbol de análisis0x10
. Por ejemplo, al reconocer la cadena , el analizador léxico podría evaluar inmediatamente esto como 16 y almacenarlo (un token de tipo integer
y valor 16), o posponer la evaluación y, en su lugar, registrar un token de tipo integer
y valor 0x10
.
Una vez que se han evaluado los literales, es posible realizar un análisis semántico posterior en forma de plegado de constantesx = 2 + 2
, lo que significa que las expresiones literales que involucran valores literales se pueden evaluar en la fase de compilación. Por ejemplo, en la declaración después de que se han evaluado los literales y 2 + 2
se ha analizado la expresión, se puede evaluar como 4, aunque el valor 4 en sí no aparece como un literal.
Los literales enteros frecuentemente tienen prefijos que indican la base y, con menor frecuencia, sufijos que indican el tipo. [1] Por ejemplo, en C++ 0x10ULL
indica el valor 16 (porque es hexadecimal) como un entero largo sin signo.
Los prefijos comunes incluyen:
0x
o 0X
para hexadecimal (base 16);0
, 0o
o 0O
para octal (base 8);0b
o 0B
para binario (base 2).Los sufijos comunes incluyen:
l
o L
para entero largo;ll
o LL
para entero largo;u
o U
para enteros sin signo.Estos afijos son algo similares a los sigilos , aunque los sigilos se asocian a identificadores (nombres), no a literales.
En algunos lenguajes, los literales enteros pueden contener separadores de dígitos para permitir la agrupación de dígitos en formas más legibles. Si esto está disponible, generalmente también se puede hacer para literales de punto flotante. Esto es particularmente útil para campos de bits y hace que sea más fácil ver el tamaño de números grandes (como un millón) de un vistazo al subitizar en lugar de contar dígitos. También es útil para números que normalmente se agrupan, como números de tarjetas de crédito o números de seguro social . [a] Los números muy largos se pueden agrupar aún más duplicando los separadores.
Por lo general, los números decimales (base 10) se agrupan en grupos de tres dígitos (que representan uno de los 1000 valores posibles), los números binarios (base 2) en grupos de cuatro dígitos (un nibble , que representa uno de los 16 valores posibles) y los números hexadecimales (base 16) en grupos de dos dígitos (cada dígito es un nibble, por lo que dos dígitos son un byte , que representa uno de los 256 valores posibles). Los números de otros sistemas (como los números de identificación) se agrupan siguiendo la convención que se utilice.
En Ada , [2] [3] C# (desde la versión 7.0), D , Eiffel , Go (desde la versión 1.13), [4] Haskell (desde la versión 8.6.1 de GHC), [5] Java (desde la versión 7), [6] Julia , Perl , Python (desde la versión 3.6), [7] Ruby , Rust [8] y Swift , [9] los literales enteros y los literales flotantes se pueden separar con un guión bajo ( _
). Puede haber algunas restricciones en la colocación; por ejemplo, en Java no pueden aparecer al principio o al final del literal, ni al lado de un punto decimal. Si bien el punto, la coma y los espacios (delgados) se utilizan en la escritura normal para la separación de dígitos, estos entran en conflicto con su uso existente en los lenguajes de programación como punto de base , separador de lista (y en C/C++, el operador de coma ) y separador de token.
Algunos ejemplos incluyen:
int unMillón = 1_000_000 ; int NúmeroDeTarjetaDeCrédito = 1234_5678_9012_3456 ; int NúmeroDeSeguridadSocial = 123_45_6789 ;
En C++14 (2014) y la siguiente versión de C a partir de 2022 [actualizar], C23 , el carácter de apóstrofo se puede utilizar para separar dígitos arbitrariamente en literales numéricos. [10] [11] El guión bajo se propuso inicialmente, con una propuesta inicial en 1993, [12] y nuevamente para C++11 , [13] siguiendo otros lenguajes. Sin embargo, esto causó un conflicto con los literales definidos por el usuario , por lo que se propuso el apóstrofo en su lugar, como una " coma superior " (que se utiliza en algunos otros contextos). [14] [15]
auto literal_entero = 1'000'000 ; auto literal_binario = 0b0100'1100'0110 ; auto literal_binario_muy_largo = 0b0000'0001'0010'0011 '' 0100'0101'0110'0111 ;