elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Reglas de conversión de enteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Reglas de conversión de enteros  (Leído 1,031 veces)
joprog

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Reglas de conversión de enteros
« en: 23 Septiembre 2018, 19:19 pm »

¿¿¿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");


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.355


Ver Perfil
Re: Reglas de conversión de enteros
« Respuesta #1 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...


« Última modificación: 23 Septiembre 2018, 19:55 pm por NEBIRE » En línea

joprog

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Reglas de conversión de enteros
« Respuesta #2 en: 23 Septiembre 2018, 21:48 pm »

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

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...
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Concatenar enteros.
Programación C/C++
Nanoc 3 9,241 Último mensaje 12 Junio 2010, 01:24 am
por Littlehorse
Ingresar 10 enteros « 1 2 »
Programación C/C++
mili03 10 8,747 Último mensaje 4 Julio 2010, 02:54 am
por d4n0n3
Desbordamiento de enteros en PHP 5.x
Noticias
wolfbcn 0 1,777 Último mensaje 29 Abril 2011, 13:47 pm
por wolfbcn
Suma de enteros en C
Programación C/C++
osofer 9 3,630 Último mensaje 15 Agosto 2011, 22:54 pm
por osofer
Lenguaje C:apuntador a arreglo de enteros y arreglo de apuntadores a enteros.
Programación C/C++
NOB2014 2 2,372 Último mensaje 27 Noviembre 2015, 12:59 pm
por NOB2014
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines