[C con Clase] Castings char, unsigned char, int y unsigned int

Facundo Curti facu.curti en gmail.com
Lun Jun 30 05:49:37 CEST 2014


Hola. Como estan? Solo agrego una aclaración a Julio.

El día 29 de junio de 2014, 11:51, Sebastian Oldani
<sebastianoldani en gmail.com> escribió:
> Bueno, eso es un problema de interpretación, cuando declaras una variable
> como char, lo que estas diciendo es que vas a usar 1 Byte de espacio de
> memoria. osea 8 bits.
>
> Hola, como va?. Lo que sucede es que let no es unsigned, entonces lo esta
> interpretando siempre como si valiera -56, cuando lo castias a unsigned int
> le va a agregar los bytes que le falten para ser un unsigned int y lo va a
> interpretar desde ese punto.
>
> Te hago ese ejemplo en hexadecimal para que se entienda.
>
> vos le cargas a un char el valor 200, que equivale a cargarle -56.
>
> let = 0xc8 (es 200 en hexa)
>
> cuando lo casteas a int, es como que let ahora vale = 0xffffffc8 si imprimis
> esto en la consola te va a decir que vale -56, sigue valiendo lo mismo.
>
> pero si le decis que interprete eso valor como un valor sin signo ese mismo
> valor vale 4294967240.

Esto es por que cuando tomas una variable como signed, toma el primer
bit, para indicar si es positivo o negativo. Si es unsigned, ese bit
queda para definir parte del valor. Y los otros 7 bit's invierten su
valor. De 0's a 1's y de 1's a 0's.

Entonces. 10000001 en unsigned, seria 129.
Pero, en unsigned, el primer 1 se toma para indicar que lo que sigue,
es un valor negativo. Y, para leerlo. Los 0's se transforman en 1's y
viceversa.

Entonces, 10000001, se leeria:
     - El primer 1 indica que es negativo.
     - Los otros 7 numeros. Los 0's pasan a 1's, y viceversa:
             1                    -               1111110
             ^                                     ^^^^^^^^
             |                                      \\     //
          Negativo                         126 en binario

En definitiva. Se leería como -126. A diferencia que si lo hiciéramos
como unsigned, que valdría 129.

Las respuestas de Sebastián y Yolmer ya complementan el resto.

Saludos! ;)
>
> Espero se entienda. Nos vemos.
>
>
> El 28/06/14 22:26, Julio Cesar escribió:
>>
>> Buenas tardes a todos, ya estoy aquí de nuevo molestándolos, espero me
>> puedan ayudar a entender un problema que tengo con estos castings en
>> particular.
>>
>> La situación es, si yo tengo:
>>
>> int main(){
>>     char let;
>>     unsigned char let2:
>>
>>     let = (char)200;
>>     let2 = (unsigned char)200;
>>     cout << (int)let << endl << (unsigned int)let << endl << (int)let2
>> << endl << (insigned int)let2 << endl;
>>
>> return 0;
>> }
>>
>> el resultado es:
>>
>> -56
>> 4294967240
>> 200
>> 200
>>
>> Entonces mi duda es sobre la primera y segunda impresion en
>> pantalla"(int)let" y  "(unsigned int)let", en la segunda a que se debe
>> que me arroje ese numero, ¿No deberia devolver 200 como en la cuarta
>> impresion en pantalla?. Y en la primera, ¿Que no deberia devolver 200
>> como en la tercera?, pues segun yo el "binario" de de let y let2 es el
>> mismo.
>>
>> Gracias por la ayuda y la atención prestada, que tengan buen día y
>> disculpen tantas molestias ocasionadas.
>>
>> Julio Cesar
>>
>>
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




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