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

Julio Cesar ggeatom en gmail.com
Mar Jul 1 23:31:01 CEST 2014


Me ha quedado bastante claro lo que ocurría. No sabía que era el primer bit
el que indicaba el signo, yo pensaba que era el último bit. Muchas gracias
a todos, que tengan un buen día.

Saludos.

Julio Cesar


El 29 de junio de 2014, 22:49, Facundo Curti <facu.curti en gmail.com>
escribió:

> 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
>
> _______________________________________________
> 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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140701/4bfea7a5/attachment.html>


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