Formas de representación simbólica


Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


2.2.4b  Formas de representación simbólica

§1  Sinopsis

En el epígrafe dedicado al Ordenador Electrónico Digital ( 0.1), se señaló que para la representación de los datos textuales (alfanuméricos) se utilizan los sistemas de codificación Us-ASCII y Unicode.  El lenguaje y el sistema de escritura varían, pero desde el punto de vista del programador C++, el texto de sus programas fuente es siempre texto plano (sin formatear) codificado en Us-ASCII ( 2.2.1a), que es el sistema exigido como entrada por los compiladores ( 1.4).

Sin embargo, la representación simbólica de datos numéricos (como aparecen representados estos números en el texto del código fuente), no siempre ocurre en formato decimal, el sistema de numeración "Occidental", como cabría esperar. Por una larga tradición informática, de cuando las consolas de entrada de los ordenadores eran exclusivamente numéricas, además del sistema decimal, se conservan otras dos formas de codificación numérica: hexadecimal y octal.

Cualquier cantidad numérica entera, puede ser representada en el texto del programa C++ en cualquiera de los sistemas citados.  Además, las funciones de salida de la propia Librería Estándar, también permite que tales cantidades puedan ser expresadas en cualquiera de estos formatos. Sin embargo, salvo caso de programas antiguos o que se trate de direcciones de memoria, es raro encontrar otras formas de expresión distintas de la decimal que es mucho más legible.

Por su parte, las cantidades numéricas fraccionarias (de punto flotante) se representan siempre en formato decimal.

Nota: en la exposición que sigue, nos referimos exclusivamente a la representación de cantidades numéricas en el Fuente (desde el punto de vista del programador). Cuestión esta que no tiene nada que ver con el formato de entrada/salida para las cantidades numéricas en tiempo de ejecución (como las ve el usuario del programa).

§2  Formato decimal

Poco hay que decir respecto a este formato, de base 10, utiliza las cifras 0 a 9.  Las cantidades fraccionarias utilizan el punto en vez de la coma. Salvo el propio cero (0), las cantidades expresadas no pueden empezar por cero, porque serían confundidas con el formato octal (afortunadamente el cero octal y el decimal coinciden).

Ejemplos:

int x = 12, y = 0;

float y = 3.14,  z = .16;

En ocasiones, cuando hay posibilidad de confusión, los textos informáticos añaden una "d" al final de las cantidades enteras decimales. Por ejemplo, 125d; 0125 y 125h son cantidades distintas (ver a continuación).

Cuando se trata de representar cantidades decimales muy grandes o muy pequeñas, es posible también utilizar la notación decimal científica comentada en el capítulo anterior ( 2.2.4a).  Por ejemplo:

float f = 2.54E20;

double d = -1.55E-200;

long double ld = 2.33E-480;

§3  Formato hexadecimal

Este sistema de codificación numérica utiliza un sistema de numeración de base 16 ( E0.1w2). Como el sistema arábigo solo posee diez cifras (del 0 al 9),  las restantes se complementan con letras del alfabeto, de la 'A' a la 'F'. C++ permite la utilización indistinta de mayúsculas y minúsculas para representar cantidades en este formato, aunque es más frecuente la utilización de mayúsculas. Es la forma tradicional de representar direcciones de memoria.

La representación de estos números debe ir precedido de 0x ó 0X, para indicar al compilador que lo que sigue es formato hexadecimal.  También es costumbre representar estas cantidades en grupos de 8 dígitos (añadiendo ceros a la izquierda).

Ejemplo:

int x = 0xFF, y = 0x000000FF;


En ocasiones los textos informáticos añaden una "h" al final de las cantidades hexadecimales.  Por ejemplo, 125h sería equivalente a 0x125, aunque la primera notación no puede ser utilizada en los fuentes de los programas C++.

§4  Formato octal

Utiliza un sistema de numeración de base 8, por lo que utiliza las cifras del sistema arábigo 0 a 7. Cualquier representación octal que utilice los dígitos 8 o 9 es un error. La representación octal de estos números debe ir precedido por el 0 (cero), para indicar al compilador que lo que sigue es octal.

Ejemplo:

int x = 0377, y = 0377634;   // ojo: cantidades en octal

§5 Ejemplo resumen

#include <iostream.h>


int main() {
  int x = 255, y = 0377, z = 0x000000FF;
  cout << "Direccion de x: " << &x << endl;          // L.4:
  cout << "Direccion de x: " << long(&x) << endl;    // L.5:
  cout << "Valor de x: " << x << endl;
  cout << "Valor de y: " << y << endl;
  cout << "Valor de z: " << z << endl;
}

Salida:

Direccion de x: 0065FE00
Direccion de x: 6684160
Valor de x: 255
Valor de y: 255
Valor de z: 255

Como puede verse en L.4, la forma estándar utilizada por el compilador para presentar direcciones de memoria, es hexadecimal y con mayúsculas; en L.5 se ha incluido un "casting" ( 4.9.9) para forzar una salida en formato decimal (más legible) de la misma dirección.

Nota: en el capítulo dedicado a la representación de Constantes Numéricas ( 3.2.3b) se incluyen detalles adicionales sobre la forma de utilizar estos formatos.