• Viernes 15 de Noviembre de 2024, 05:08

Autor Tema:  Re: ¿Por que me imprime esto... ?  (Leído 3692 veces)

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: ¿Por que me imprime esto... ?
« en: Lunes 15 de Septiembre de 2003, 17:21 »
0
Estoy empezando en esto de la programacion en C y tengo el siguiente codigo:
#include <stdio.h>
#include <conio.h>
void main()
{
int i;
unsigned int j;
clrscr();
j=60000;
i=j;
printf("i=%d,j=%u",i,j);
getch();
}
... el cual me imprime lo siguiente:
i=-5536, j=60000
ya le di vueltas por todos lados y no entiendo porque imprime eso. ¿Alguien podria ayudarme?

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: ¿Por que me imprime esto... ?
« Respuesta #1 en: Lunes 15 de Septiembre de 2003, 18:20 »
0
porque una variable int solo te sirve para almecenar desde -32670 hasta 32670, si es unsigned int te servira desde 0 hasta 65240..mas o menos.

entonces si un unsigned int de 60000 se lo asignas a un int, lo que ocurre es...

recuerda que todo esto realmente esta ocurriendo a nivel binario, asi que en esta asignacion como es mas grande de lo que cabe entre 0 y 32670 de un int, el toma el numero como si fuera la representacion de numero negativo, asi que le hace complemento a 2 bit y le suma 1.

Si haces la operacion te daras cuenta.


Debes tener en cuenta la capacidades de almacenamiento que requieres , porque algo asi sucedera cuando te desbordes en la mayoria de tipos de datos.


Juank:sorcerer:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: ¿Por que me imprime esto... ?
« Respuesta #2 en: Jueves 18 de Septiembre de 2003, 23:52 »
0
ok. Gracias juank por la informacion. Ya realize la operacion binaria y tienes razon. Gracias de nuevo.

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: ¿Por que me imprime esto... ?
« Respuesta #3 en: Viernes 3 de Octubre de 2003, 22:51 »
0
tengo una pequeña duda juank...
el valor en binario de 60000 es:

11101010 01100000

para hacer el complemento a 2 primero hago el complemento a uno:

11101010 01100000   ---   ec1 (60000 en binario)
00010101 10011111   ---   ec2 (complemento a uno)

el complemento a 2 lo obtengo sumando 1 a la ec2:

00010101 10011111
                               1
---------------------------
00010101 10100000   --- ec3 (complemento a 2)

Este numero binario (ec3) en decimal es 5536. Este es el resultado que me imprime en pantalla el programa pero en negativo. ¿hice alguna operación mal? ¿donde quedo el signo?

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: ¿Por que me imprime esto... ?
« Respuesta #4 en: Sábado 4 de Octubre de 2003, 16:33 »
0
Perdon por la molestia nuevamente juank, pero tengo otra duda. Mira, tengo el siguiente programa:

#include <stdio.h>
#include <conio.h>

void main()
{
     int i=32000;
     i=i*3;
     printf("i=%d",i);
     getch();
}
el valor de 32000 si lo puede tomar i por que esta dentro del rango de int.
al multiplicar el valor de i * 3 me queda
96000.
¿A este valor le hago el complemento a 2?
por que no me da el resultado que me imprime en pantalla. De antemano, muchas gracias por la atencion.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: ¿Por que me imprime esto... ?
« Respuesta #5 en: Domingo 5 de Octubre de 2003, 16:32 »
0
No tengo idea de que pasa...
He probado esto en mi casa y me da igual...
se supone:

Un Tipo Int es de 2 bytes, entonces

2 elevado a la 16 = 65536 esto es para los tipos unsigned, pero si tiene signo el byte más significativo no lo podemos usar, segun esto cuando es con signo tenemos:

2 elevado a la 15 = 32768

... Eso me enseñaron en la U.
JAJAJA

Es el compilador, si lo compilo en el rhide y lo ejecuto todo funciona como te pasa a ti, pero en compiladores más viejos, como por ejemplo la version 2.0 de turboc si sucede el desbordamiento de memoria.

El codio que produce el rhide es de gran calidad, asi que es probable que posea hasta cierto punto rutinas de reasignacion de memoria para evitar desbordamientos de este tipo.

Tal vez sea problema.. o mejor beneficio del compilador que estes utilizando, seguramente entre todas las opciones u optimizaciones de compilacion, habra alguna que deshabilite esta propiedad.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: ¿Por que me imprime esto... ?
« Respuesta #6 en: Martes 7 de Octubre de 2003, 19:19 »
0
Gracias por la atencion Juank.

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: ¿Por que me imprime esto... ?
« Respuesta #7 en: Lunes 20 de Octubre de 2003, 20:48 »
0
ya se por que !!!!
realize varias pruebas don diferentes programas del mismo tipo y ya se porque me imprime eso. Si a alguien le interesa, que me pregunte y se lo trato de explicar con mucho gusto (cualquiera de los dos programas aqui expuestos).

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
Re: ¿Por que me imprime esto... ?
« Respuesta #8 en: Miércoles 22 de Octubre de 2003, 03:37 »
0
Por que sucede eso???

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: ¿Por que me imprime esto... ?
« Respuesta #9 en: Sábado 25 de Octubre de 2003, 16:00 »
0
Checa esta pagina que hice con la explicación de que es lo que pasa realmente en el programa.

http://www.diversionesjubilubi.3a2.com/

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: ¿Por que me imprime esto... ?
« Respuesta #10 en: Viernes 31 de Octubre de 2003, 16:56 »
0
utilizando la misma logica que di en la solucion del programa anterior... ¿alguien me puede decir que imprime y por que el segundo programa?

int i=32000;
i=i*3;
printf("i=%d",i);

ya tengo la respuesta, es nada más para que le piensen un poco (a los que estamos empezando en esto)

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: ¿Por que me imprime esto... ?
« Respuesta #11 en: Viernes 31 de Octubre de 2003, 19:17 »
0
no creas que nbo he mirado tus post...
ewl domingo te dare respuesta.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
Re: ¿Por que me imprime esto... ?
« Respuesta #12 en: Sábado 1 de Noviembre de 2003, 02:10 »
0
creo que deberia imprimir:
i=960
o me equivoco?

jubilubi

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
    • http://www.diversioNESjubilubi.3a2.com
Re: ¿Por que me imprime esto... ?
« Respuesta #13 en: Lunes 3 de Noviembre de 2003, 02:51 »
0
El programa imprime esto:

i=30464

Recuerden checar la direccion de la explicacion del programa anterior...

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
¿Por que me imprime esto... ?
« Respuesta #14 en: Lunes 3 de Noviembre de 2003, 03:43 »
0
Lo voy a verificar.