3.2.3b Constantes enteras
§1 Sinopsis
Las constantes enteras representan un int, y pueden estar expresadas en los sistemas de numeración decimal ; octal o hexadecimal . En ausencia de ningún sufijo , el tipo de una constante entera se deduce de su valor según se muestra en las tablas que siguen. Observe que las reglas para las constantes decimales son distintas del resto.
§2 Decimal
Se permiten constantes enteras en formato decimal (base 10, 2.2.4b) dentro del rango 0 a 4,294,967,295; las que excedan este límite serán truncadas. Observe que las constantes decimales no pueden comenzar con cero, porque serían interpretadas como octales.
int i = 10; // decimal 10
int i = 010; // decimal 8 (octal 10)
int i = 0; // decimal 0 = octal 0
Tipos adoptados por las constantes decimales en función del valor declarado (en ausencia de sufijos L o U)
0 a 32,767 int
32,768 a 2,147,483,647 long
2,147,483,648 a 4,294,967,295 unsigned long
>4294967295 truncado
§3 Octal
Todas las constantes que empiecen por cero se suponen en octal (base 8, 2.2.4b). Si una constante de este tipo contiene dígitos ilegales (8 o 9), se produce un mensaje de error; como se indica en la tabla adjunta, las que exceden del valor máximo 037777777777 son truncadas.
Tipos adoptados por las constantes Octales en función del valor declarado (en ausencia de sufijos L o U).
00 a 077777 int
010000 a 0177777 unsigned int
02000000 a 017777777777 long
020000000000 a 037777777777 unsigned long
> 037777777777 truncado
§4 Hexadecimal
Cualquier constante que comience por 0x o 0X es considerada hexadecimal [1], base 16 ( 2.2.4b), después se pueden incluir los dígitos válidos (0...9, a...f, A...F). Como se indica e el cuadro adjunto, las que excedan del valor máximo 0xFFFFFFFF son truncadas.
Tipos adoptados por las constantes hexadecimales en función del valor declarado (en ausencia de sufijos L o U).
0x0000 a 0x7FFF int
0x8000 a 0xFFFF unsigned int
0x10000 a 0x7FFFFFFF long
0x80000000 a 0xFFFFFFFF unsigned long
>0xFFFFFFFF truncado
Ejemplo:
long lg1 = 0xFFFF; lg2 = 0xFF;
cout << lg1 << endl; // -> 65535
cout << lg2 << endl; // -> 255
#define CS_VREDRAW 0x0001
#define CS_HREDRAW 0x0002
§5 Sufijos: long (L) y unsigned (U)
La adición de sufijos en la definición de una constante puede forzar que esta sea de un tipo específico, así pues, los sufijos funcionan como una especie de "casting" para las constantes. Se utilizan las letras U u L l. Estos sufijos se pueden utilizar juntos y en cualquier orden o grafía (ul, lu, Ul, lU, uL, Lu, LU o UL).
Los sufijos L / l después de una constante la fuerzan a ser declarada como long. Ejemplo:
const x = 7L; // x es long
Los sufijos U / u la fuerzan a que sea declarada como unsigned; en este caso, con independencia de la base utilizada, la constante será considerada unsigned long si el valor del número es mayor que el decimal 65,535. Ejemplo:
const x = 7U; // x es unsigned int
const y = 66000U; // y es unsigned long
En ausencia de alguno de estos sufijos el tipo de la
constante es el primero de los que se señalan que pueda albergar su valor.
Decimal: int, long int, unsigned long int
Octal: int, unsigned int, long int, unsigned long int
Hexadecimal: int, unsigned int, long int, unsigned long int
Si la constante tiene un sufijo U o u, su tipo
es unsigned int, unsigned long o int (el primero que pueda albergar el valor).
Si tiene un sufijo L o l, su tipo es long int o unsigned long int (el primero que pueda albergar el valor).
Si la constante tiene ambos sufijos, u e l (ul, lu, Ul, lU, uL, Lu, LU o UL), su tipo de es unsigned long int. Ejemplo:
const z = 0UL; // z es unsigned long
Como puede verse, las constantes enteras sin L o U compendian la
representación de constantes enteras en cualquiera de los tres sistemas de numeración (en C++Builder).
Nota: algunos compiladores utilizan los sufijos ll/LL y ull/ULL para referirse a los enteros extendidos ( 3.2.3d) long long y unsigned long long respectivamente.
[1] Sin embargo, como se verá más adelante, en secuencias de escape ( 3.2.3e), no es necesario \0x para indicar un valor hexadecimal; es suficiente con poner \x ó \X.