2012-01-10 6 views
48

me he encontrado a través de algunos código como este:ULL sufijo en un literal numérico

line += addr & 0x3fULL; 

Obviamente, 'U' y 'L' no son dígitos hexadecimales. Supongo que el 'ULL' al final de ese hex numérico literal significa "Largo largo sin firmar" - ¿estoy en lo correcto? (este tipo de cosas es muy difícil de googlear) si es así, ¿esto es algún tipo de modificador de sufijo en el número?

+0

C: [N1570] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) 6.4.4.1. C++: [N4700] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4700.pdf) 5.13.2 [lex.icon]. En ambos idiomas, el sufijo no distingue entre mayúsculas y minúsculas (excepto que 'lL' y' Ll' no están permitidos) y 'LL' y' U' se especifican por separado, por lo que puede tener cualquiera de 'ull',' uLL' , 'Ull',' ULL', 'llu',' llU', 'LLu',' LLU'. –

Respuesta

48

Desde el gccmanual:

ISO C99 soporta tipos de datos para los números enteros que son al menos 64 bits de ancho, y como un GCC extensión les apoya en modo de C90 y en C++. Simplemente escriba long long int para un entero con signo, o unsigned long long int para un entero sin signo. Para convertir un entero constante del tipo long long int, agregue el sufijo LL al número entero. Para convertir un número entero en constante de tipo unsigned long long int, agregue el sufijo ULL al número entero.

+2

El manual de GCC está un poco desactualizado: ya no son extensiones de C++. – MSalters

+0

@MSalters Creo que todavía es válido antes de C++ 11, ¿verdad? Probablemente, la respuesta general más ideal sería del estándar C++ 11: https://stackoverflow.com/a/34931381/2642059 –

+1

@JonathanMee: en C++ 98 fueron extensiones. Pero el consenso de StackOverflow es que, a menos que se especifique lo contrario, se presuponen las versiones actuales de software y estándar. Es decir. eso es C++ 14 por ahora, C++ 17 pronto. – MSalters

21

Sí, eso es correcto.

  • 0x prefix lo convierten en un literal hexadecimal.
  • ULL sufijo lo hace tipo unsigned long long.
+0

Supongo que hace que el tipo * al menos * sea así, pero dado que es el tipo más grande disponible, probablemente sea lo mismo. –

+0

Tienes razón. Acabo de probarlo con 'long long x = 0xfffffffffffful;' en Windows y no se trunca, no hay advertencias tampoco. – Mysticial

+0

Todos los literales solo especifican el ancho mínimo * deseado, siendo el mínimo absoluto 'int'. Pero cualquier literal tiene un tipo que lo admite, si hay alguno ... –

8

Estoy planteando una nueva respuesta porque reconozco que las respuestas actuales no citan de una fuente multiplataforma. El estándar C++ 11 dicta que un literal con U/u y LL/ll sufijos es un literal de tipo: unsigned long long int [source]

U/u es el/C++ sufijo C para un entero sin signo.
LL/ll es el sufijo C/C++ para un entero long long que es un new type in C++11 y requiere una longitud de al menos 64 bits.

Notas:

  1. La palabra clave int puede omitirse si se utilizan los modificadores, unsigned long long por ejemplo. Así que esto definirá one como unsigned long long int, y cualquier número asignado será static_cast a unsigned long long int: unsigned long long one = 1;
  2. C++ 11 marcó el advenimiento de auto. Que establece el tipo de variable para el tipo asignado a él en la declaración. Por ejemplo, debido 2ULL es un unsigned long long int literal two se definirá como un unsigned long long int: auto two = 2ULL;
  3. C++ 14 de orden introducido sufijos literales independientes. Anteriormente, el sufijo U/u tenía que haber precedido a cualquier sufijo de tamaño. Pero alrededor de C++ 14 los sufijos se aceptan en cualquier orden, por lo que ahora es legal unsigned long long int literal 13LLU.
+1

Porque mi mente funciona de esa manera (pero no tengo C++ 14 a mano): supongo que C++ 14 no permite '13LUL'? – TripeHound

+0

@TripeHound http://ideone.com tiene C++ 14 y no permite un sufijo LUL: http://ideone.com/AWmW8H Esto parece coincidir con la intención de: http://en.cppreference.com/w/cpp/language/integer_literal # Explicación –

Cuestiones relacionadas