[C con Clase] Duda con variables char

Steven R. Davidson vze266ft en verizon.net
Lun Mar 17 04:30:36 CET 2008


Hola David,

David Reza wrote:
> 
> Por qué -65 es igual a 191?
> 
> Se supone que si la variable es signed sólo puedo almacenar valores  
> entre 0 y 255 y si es unsigned, valores entre -254 al 255?
> 

Esto tiene que ver con la representación interna de números enteros. 
Para valores negativos, se suele usar el complemento de 2. La fórmula es 
la siguiente:

complemento de 2 = 1 + complemento de 1

El complemento de 1 es simplemente aplicar la negación a nivel de bits. 
Por ejemplo, para representar el número entero -28, hacemos lo siguiente:

28 => 00011100

complemento de 1 de 00011100 = NOT 00011100 = 11100011

Aplicando la fórmula: complemento de 2 = 1 + complemento de 1, obtenemos,

1 + 11100011 = 11100100

Si este valor es interpretado como un número con signo, entonces 
representa el valor -28 (en decimal). Sin embargo, si se interpreta como 
un número sin signo, entonces el valor es 228.

Por esta razón, el valor -65 y 191 son iguales desde el punto de vista 
de los bits que representan ambos valores. Como ya he dicho, la decisión 
de tomar uno u otro valor depende de su interpretación: con o sin signo.

Por lo tanto, las cotas inferior y superior para un 'signed char' son: 
-128 y +127, respectivamente, mientras que para un 'unsigned char', 
tenemos: 0 y 255.

> Lo que se me ocurre es que los símbolos alfanuméricos no son tantos y  
> se repiten, por lo tanto pueden tener   2 códigos ASCII. Estoy mal?

En cuanto a los códigos ASCII, la tabla estándar es de 7 bits. Usamos 
'char' porque podemos representar valores de 8 bits, que se ajusta a los 
7 necesarios. Algunos sistemas extendieron la tabla ASCII a 8 bits 
agregando más caracteres como por ejemplo las eñes, las vocales con 
tildes, circunflejos, y otras virgulillas. Para esta extensión, aunque 
usemos 'char' con signo, realmente la convertiríamos a un 'char' sin 
signo. Como ya he explicado, el cambio no es tan drástico, ya que el 
valor binario es el mismo; lo que cambia es la interpretación de tal valor.


Espero que todo esto aclare el tema.

Steven






Más información sobre la lista de distribución Cconclase