7 Normas para la notación

Que no te asuste el título. Lo que aquí trataremos es más simple de lo que parece.

En este capítulo hablaremos sobre las reglas que rigen cómo se escriben las constantes en C++ según diversos sistemas de numeración y el uso tiene cada uno.

Constantes int

En C++ se usan tres tipos de numeración para la definición de constantes numéricas: la decimal, la octal y la hexadecimal; según se use la numeración en base 10, 8 ó 16, respectivamente.

Por ejemplo, el número 127, se representará en notación decimal como 127, en octal como 0177 y en hexadecimal como 0x7f.

Cualquier cantidad puede expresarse usando números de diferentes bases. Generalmente, los humanos, usamos números en base 10, pero para los ordenadores es más cómodo usar números en bases que sean potencias de 2, como 2 (numeración binaria), 8 (numeración octal) ó 16, (numeración hexadecimal).

El valor de cualquier cantidad se puede calcular mediante la siguiente fórmula:

N = Σ(di * basei)

Donde di es cada uno de los dígitos, empezando con i=0 para el dígito más a la derecha, y base es el valor de la base de numeración usada.

Por ejemplo, si el número abcd expresa una cantidad en base n, el valor del número se puede calcular mediante:

N = d*n0 + c*n1 + b*n2 + a*n3

En notación octal se necesitan sólo ocho símbolos, y se usan los dígitos del '0' al '7'. En hexadecimal, se usan 16 símbolos, los dígitos del '0' al '9', que tienen el mismo valor que en decimal; para los seis símbolos restantes se usan las letras de la 'A' a la 'F', indistintamente en mayúsculas o minúsculas. Sus valores son 10 para la 'A', 11 para la 'B', y sucesivamente, hasta 15 para la 'F'.

Según el ejemplo anterior, el valor 0177 expresa una cantidad en notación octal. En C++, el prefijo '0' indica numeración octal. Tendremos, por lo tanto, el número octal 177, que según nuestra fórmula vale:

N = 7*80 + 7*81 + 1*82 = 7*1 + 7*8 + 1*64 = 7 + 56 + 64 = 127

Análogamente, en el número 0x7f, "0x" se usa como prefijo que indica que se trata de un número en notación hexadecimal. Tenemos, por lo tanto, el número 7F. Aplicando la fórmula tenemos:

N = F*160 + 7*161 = 15*1 + 7*16 = 15 + 112 = 127

Por último, aunque parezca obvio, el número 127 estará expresado en base 10, y también podemos aplicar la fórmula:

N = 7*100 + 2*101 + 1*102 = 7*1 + 2*10 + 1*100 = 7 + 20 + 100 = 127

Nota: Si no tienes demasiado fresco el tema de las potencias, recordaremos que cualquier número elevado a 0 es 1.

Hay que tener mucho cuidado con las constantes numéricas, en C++ no es el mismo número el 0123 que el 123, aunque pueda parecer otra cosa. El primero es un número octal y el segundo decimal.

La ventaja de la numeración hexadecimal es que los valores enteros requieren dos dígitos por cada byte para su representación. Así, un byte puede tomar valores hexadecimales entre 0x00 y 0xff, dos bytes entre 0x0000 y 0xffff, etc. Además, la conversión a binario es casi directa, cada dígito hexadecimal se puede sustituir por cuatro bits (cuatro dígitos binarios), el '0x0' por '0000', el '0x1' por '0001', hasta el '0xf', que equivale a '1111'. En el ejemplo el número 127, ó 0x7f, sería en binario '01111111'.

En la notación binaria usamos como base el 2, que es la base más pequeña que se puede usar. En este sistema de numeración sólo hay dos dígitos: 0 y 1. Por supuesto, también podemos aplicar nuestra fórmula, de modo que el número 01111111 vale:

N = 1*20 + 1*21 + 1*22 + 1*23 + 1*24 + 1*25 + 1*26 + 0*27
  = 1*1 + 1*2 + 1*4 + 1*8 + 1*16 + 1*32 + 1*64 + 0*128= 1 + 2+ 4 + 8 + 16 + 32 + 64 = 127

Con la numeración octal sucede algo similar a lo que pasa con la hexadecimal, salvo que cada dígito octal agrupa tres bits (tres dígitos binarios). Así un byte puede tomar valores octales entre 0000 y 0377, dos bytes entre 0000000 y 0177777, etc. Además, la conversión a binario también es es casi directa, ya que cada dígito octal se puede sustituir por tres bits, el '0' por '000', el '1' por '001', hasta el '7', que equivale a '111'. En el ejemplo el número 127, ó 0177, sería en binario '01111111'.

Aún no hemos hablado de los operadores de bits, pero podemos adelantar que C++ dispone de tales operadores, que básicamente realizan operaciones con números enteros bit a bit. De este modo, cuando trabajemos con operadores de bits, nos resultará mucho más sencillo escribir los valores de las constantes usando la notación hexadecimal u octal, ya que es más directa su conversión a binario.

Constantes long

Cuando introduzcamos valores constantes long debemos usar el sufijo "L", sobre todo cuando esas constantes aparezcan en expresiones condicionales, y por coherencia, también en expresiones de asignación. Por ejemplo:

long x = 123L;
if(0L == x) Imprimir("Valor nulo");

A menudo recibiremos errores del compilador cuando usemos constantes long sin añadir el sufijo L, por ejemplo:

if(1343890883 == x) Imprimir("Número long int");

Esta sentencia hará que el compilador emita un error ya que no puede usar un tamaño mayor sin una indicación explícita.

Hay casos en los que los tipos long e int tienen el mismo tamaño, en ese caso no se producirá error, pero no podemos predecir que nuestro programa se compilará en un tipo concreto de compilador o plataforma.

Constantes long long

En el caso de valores constantes long long tendremos que usar el sufijo "LL", tanto cuando esas constantes aparezcan en expresiones condicionales, como cuando lo hagan en expresiones de asignación. Por ejemplo:

long long x = 16575476522787LL;
if(1LL == x) Imprimir("Valor nulo");

A menudo recibiremos errores del compilador cuando usemos constantes long long sin añadir el sufijo LL, por ejemplo:

if(16575476522787 == x) Imprimir("Número long long");

Esta sentencia hará que el compilador emita un error ya que no puede usar un tamaño mayor sin una indicación explícita.

Constantes unsigned

Del mismo modo, cuando introduzcamos valores constantes unsigned debemos usar el sufijo "U", en las mismas situaciones que hemos indicado para las constantes long. Por ejemplo:

unsigned int x = 123U;
if(3124232U == x) Imprimir("Valor encontrado");

Constantes unsigned long

También podemos combinar en una constante los modificadores unsigned y long, en ese caso debemos usar el sufijo "UL", en las mismas situaciones que hemos indicado para las constantes long y unsigned. Por ejemplo:

unsigned long x = 123456UL;
if(3124232UL == x) Imprimir("Valor encontrado");

Constantes unsigned long long

En una constante también podemos usar los modificadores unsigned y long long, para esos casos usaremos el sufijo "ULL", en todas las situaciones que hemos indicado para las constantes long long y unsigned. Por ejemplo:

unsigned long long x = 123456534543ULL;
if(3124232ULL == x) Imprimir("Valor encontrado");

Comentarios de los usuarios (1)

Aiden
2016-04-15 23:59:33

buen dia, os podria preguntar algo..? soy nuevo programando phyton. my_float debe de tener el valor a 1,23 pero me muestra el error, alguien podria decirme como darle el valor?? agradeceria mucho un consejo. gracias