Reglas de conversión de enteros

Iniciado por joprog, 23 Septiembre 2018, 19:19 PM

0 Miembros y 2 Visitantes están viendo este tema.

joprog

¿¿¿Por qué la salida de este código fuente es 1 2 3 4 5???
    char x;
    char y;
   
    x = -128;
    y = -x;
   
    if (x == y) puts("1");
    if ((x - y) == 0) puts("2");
    if ((x + y) == 2 * x) puts("3");
    if (((char)(-x) + x) != 0) puts("4");
    if (x != -y) puts("5");

Serapis

#1
Es todo darle vueltas a lo mismo, pero con distintas 'palabras'...

Un byte son 8 bits, que en decimal recogen los valores desde el 0 al 255.
Cuando se toma con signo, los valores son en el rango -128 a -1 y 0 a 127
Si te fijas bien siguen siendo '8 bits'... luego esto implica que una parte de los negativos 'sobrescribe' a una parte de los positivos...

Cuáles?. Cuando se decidió sobre el asunto, se acordó que lo adecuado es que cuando dos valores se sumen, sea un resultado coherente y lo mismo si se restan... luego si 127 + 128 = 255, y 127 + 1 = 128, y -1 + 1 = 0  ....entonces...

...coge tu calculadora y escribe estos valores a binario, con ceros y unos...
verás que -1 no podría ser el 128, porque si 127+ 1 = 128, entonces cuando -1+1=0, no podría ser si -1 tuviera el valor de 128 (128-1 = 127).
Ahora puedes entender que -128= 128 y que -1= 255, ahora sí: 255+1 = 256 pero como un byte solo tiene 8 bits, se quedan los 8 ceros, y el otro bit es el 9º, el de desbordamiento... luego para un byte (o char), 255+1= 0 y 0-1= 255 tanto si es positivo como si es negativo , pero si es negativo, lo vemos 'artificiosamente' como '-1'... Quien determina si debe aparecer 255 o -1, finalmente es el tipo de datos declarado...

En fin juega en los límites de los valores positivos y negativos y tradúcelos a binario... y terminarás por comprenderlo.

...y en el supuesto de que tus dudas fueran más simples, y lo que preguntes (sin transparencias) sea porqué la salida es "1 2 3 4 5", es porque es lo que se manda imprimir cuando se cumple como verdad la condición a cada línea... (ya más arriba te he aclarado por qué son verdad las condiciones).

OJO: Fíjate que el char, no entiende de signo, se guarda igual -128 que 128, -1 que 255, al asignar un valor con signo, el compilador hace su trabajo y realiza la conversión antes de la asignación... podriase haber elegido que diera una excepción, pero sería desafortunada...

joprog

Muchas gracias por tu respuesta, me resolvió todas las dudas.
Un saludo!!

Cita de: NEBIRE en 23 Septiembre 2018, 19:49 PM
Es todo darle vueltas a lo mismo, pero con distintas 'palabras'...

Un byte son 8 bits, que en decimal recogen los valores desde el 0 al 255.
Cuando se toma con signo, los valores son en el rango -128 a -1 y 0 a 127
Si te fijas bien siguen siendo '8 bits'... luego esto implica que una parte de los negativos 'sobrescribe' a una parte de los positivos...

Cuáles?. Cuando se decidió sobre el asunto, se acordó que lo adecuado es que cuando dos valores se sumen, sea un resultado coherente y lo mismo si se restan... luego si 127 + 128 = 255, y 127 + 1 = 128, y -1 + 1 = 0  ....entonces...

...coge tu calculadora y escribe estos valores a binario, con ceros y unos...
verás que -1 no podría ser el 128, porque si 127+ 1 = 128, entonces cuando -1+1=0, no podría ser si -1 tuviera el valor de 128 (128-1 = 127).
Ahora puedes entender que -128= 128 y que -1= 255, ahora sí: 255+1 = 256 pero como un byte solo tiene 8 bits, se quedan los 8 ceros, y el otro bit es el 9º, el de desbordamiento... luego para un byte (o char), 255+1= 0 y 0-1= 255 tanto si es positivo como si es negativo , pero si es negativo, lo vemos 'artificiosamente' como '-1'... Quien determina si debe aparecer 255 o -1, finalmente es el tipo de datos declarado...

En fin juega en los límites de los valores positivos y negativos y tradúcelos a binario... y terminarás por comprenderlo.

...y en el supuesto de que tus dudas fueran más simples, y lo que preguntes (sin transparencias) sea porqué la salida es "1 2 3 4 5", es porque es lo que se manda imprimir cuando se cumple como verdad la condición a cada línea... (ya más arriba te he aclarado por qué son verdad las condiciones).

OJO: Fíjate que el char, no entiende de signo, se guarda igual -128 que 128, -1 que 255, al asignar un valor con signo, el compilador hace su trabajo y realiza la conversión antes de la asignación... podriase haber elegido que diera una excepción, pero sería desafortunada...