Articulo de referencia

Literal entero

En informática , un literal entero es un tipo de literal para un entero cuyo valor se representa directamente en el código fuente . Por ejemplo, en la instrucción de asignación ...

En informática , un literal entero es un tipo de literal para un entero cuyo valor se representa directamente en el código fuente . Por ejemplo, en la instrucción de asignación x = 1, la cadena 1es un literal entero que indica el valor 1, mientras que en la instrucción x = 0x10la cadena 0x10es un literal entero que indica el valor 16, que se representa 10en hexadecimal (indicado por el 0xprefijo).

Por el contrario, en x = cos(0), la expresión cos(0)se evalúa a 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 + 2se evalúa a 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".

Análisis sintáctico

Reconocer una cadena (secuencia de caracteres en el código fuente) como un literal entero forma parte de la fase de análisis léxico (lexing), mientras que evaluar el literal a su valor forma parte de la fase de análisis semántico . Dentro del analizador léxico y la gramática de frases, la clase de token se suele denotar como integer, donde la minúscula indica una clase de token a nivel léxico, en contraposición a una regla de producción a nivel de frase (como ListOfIntegers). Una vez que una cadena ha sido lexicada (tokenizada) como un literal entero, su valor no se puede determinar sintácticamente (es simplemente un entero), y la evaluación de su valor se convierte en una cuestión semántica.

Los literales enteros generalmente se analizan léxicamente con expresiones regulares , como en Python . [ 1 ]

Evaluación

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 al reconocer un literal entero, mientras que en otros casos se pospone hasta la etapa de análisis sintáctico, o hasta después de que el árbol de análisis sintáctico se haya construido por completo. Por ejemplo, al reconocer la cadena, 0x10el analizador léxico podría evaluar inmediatamente esto a 16 y almacenar eso (un token de tipo integery valor 16), o posponer la evaluación y en su lugar registrar un token de tipo integery valor 0x10.

Una vez evaluados los literales, es posible realizar un análisis semántico adicional mediante la optimización de constantesx = 2 + 2 , lo que significa que las expresiones literales que involucran valores literales pueden evaluarse durante la fase de compilación. Por ejemplo, en la instrucción, después de que se hayan evaluado los literales y se haya analizado la expresión 2 + 2, esta puede evaluarse como 4, aunque el valor 4 no aparezca como un literal.

Sufijos

Los literales enteros frecuentemente tienen prefijos que indican la base y, con menos 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:

Los sufijos comunes incluyen:

  • lo Lpara enteros largos.
  • llo LLpara enteros muy largos.
  • uo Upara enteros sin signo.

Estos afijos son algo similares a los sellos , aunque los sellos se adjuntan a identificadores (nombres), no a literales.

Separadores de dígitos

En algunos lenguajes, los literales enteros pueden contener separadores de dígitos para permitir agruparlos en formas más legibles. Si esta función está disponible, generalmente también se puede aplicar a los literales de punto flotante. Esto es particularmente útil para campos de bits y facilita la visualización del 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 suelen agruparse, como números de tarjetas de crédito o números de seguridad social . [ a ] Los números muy largos pueden agruparse aún más duplicando los separadores.

Normalmente, 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 según la convención que se utilice.

Ejemplos

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 de punto flotante se pueden separar con un guion bajo ( _). Puede haber algunas restricciones en la ubicación; por ejemplo, en Java no pueden aparecer al principio o al final del literal, ni junto a 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 listas (y en C/C++, el operador coma ) y separador de tokens.

Algunos ejemplos son:

int unMillón = 1_000_000 ; int númeroTarjetaCrédito = 1234_5678_9012_3456 ; int númeroSeguridadSocial = 123_45_6789 ;

En C++14 (2014) y la siguiente versión de C a partir de 2022., C23 , el carácter apóstrofo puede usarse para separar dígitos arbitrariamente en literales numéricos. [ 10 ] [ 11 ] El guion bajo se propuso inicialmente, con una propuesta inicial en 1993, [ 12 ] y nuevamente para C++11 , [ 13 ] siguiendo a otros lenguajes. Sin embargo, esto causó conflicto con los literales definidos por el usuario , por lo que se propuso el apóstrofo en su lugar, como una " coma mayúscula " (que se usa en algunos otros contextos). [ 14 ] [ 15 ]

auto integer_literal = 1'000'000 ; auto binary_literal = 0b0100'1100'0110 ; auto very_long_binary_literal = 0b0000'0001'0010'0011 '' 0100'0101'0110'0111 ;

Notas

  1. Normalmente, los números sensibles como estos no se incluirían como literales.

Referencias

  1. 1 2 " 2.4.4. Literales enteros y enteros largos "
  2. "Manual de referencia del lenguaje Ada '83: 2.4. Literales numéricos" .
  3. ""Fundamentos del diseño del lenguaje de programación Ada®": 2.1 Estructura léxica" .
  4. "Notas de la versión 1.13 de Go: cambios en el idioma" . Consultado el 5 de noviembre de 2020 .
  5. "Guía del usuario del compilador Glasgow Haskell: 11.3.7. Guiones bajos numéricos" . Consultado el 31 de enero de 2019 .
  6. "Guiones bajos en literales numéricos" . Consultado el 12 de agosto de 2015 .
  7. "Novedades de Python 3.6" .
  8. "Literales y operadores" . Consultado el 15 de noviembre de 2019 .
  9. "El lenguaje de programación Swift: Estructura léxica" .
  10. Crowl, Lawrence; Smith, Richard; Snyder, Jeff; Vandevoorde, Daveed (25 de septiembre de 2013). "N3781 Comilla simple como separador de dígitos" (PDF) .
  11. Aaron Ballman (15-12-2020). "N2626: Separadores de dígitos" (PDF) .
  12. John Max Skaller (26 de marzo de 1993). "N0259: Una propuesta para permitir literales binarios y algunos otros pequeños cambios en el Capítulo 2: Convenciones léxicas" (PDF) .
  13. Crowl, Lawrence (2007-05-02). "N2281: Separadores de dígitos" .
  14. ^ Vandevoorde, Daveed (21 de septiembre de 2012). "N3448: Separación de dígitos indolora" (PDF) .
  15. Crowl, Lawrence (19 de diciembre de 2012). "N3499: Separadores de dígitos" .
Obtenido de " https://en.wikipedia.org/w/index.php?title=Integer_literal&oldid=1324850815 "