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]


Problema

La siguiente cuestión, enviada por un lector [1], decía más o menos así:

El profesor propuso el siguiente ejemplo:

cout<<(char)(136)<<endl;

cout<<(char)(-120)<<endl;

La salida es la misma en ambos casos.  ¿Porqué se produce este resultado?


La respuesta es que como indicábamos antes, cuando el compilador encuentra una constante del tipo 136 o -120, en ausencia de cualquier otro tipo de indicación, generalmente las transforma en un double. En este caso, como ambas expresiones utilizan un modelado explícito de estilo clásico ( 4.9.9) a tipo char, los doubles son transformados a dicho tipo, cuya representación interna para las versiones signed y unsigned ocupa 8 bits ( 2.2.4).

El carácter ASCII 136 es el que se obtiene en la primera salida. Es un carácter por encima de 127 por lo que su representación depende del juego de caracteres del Sistema. En mi caso, utilizando el compilador Borland C++ 5.0 en una ventana DOS bajo Windows 32, es el carácter ê.  La presentación binaria del char 136 es:

10001000

Para la segunda salida, el compilador utiliza el patrón de bits correspondiente al signed char -120. Teniendo en cuenta que la representación binaria del char 120 es:

01111000

y que este compilador (y la mayoría de los que corren sobre plataformas Intel) utiliza el complemento a dos para representar los enteros negativos, la representación binaria del char -120 es el resultado de la suma:

  10000111

+ 00000001

-----------

  10001000

Como puede verse, la representación interna del signed char -120 y del char 136 son idénticas, razón por la cual la salida es la misma en ambos casos.

  Inicio.


[1]  Aunque incluyo aquí la solución, mi respuesta a estas consultas es siempre la misma: generalmente NO atiendo este tipo de cuestiones académicas (el "Home work" es justamente eso...).