SoloCodigo
Programación General => C/C++ => Mensaje iniciado por: jubilubi en Lunes 15 de Septiembre de 2003, 17:21
-
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?
-
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:
-
ok. Gracias juank por la informacion. Ya realize la operacion binaria y tienes razon. Gracias de nuevo.
-
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?
-
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.
-
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.
-
Gracias por la atencion Juank.
-
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).
-
Por que sucede eso???
-
Checa esta pagina que hice con la explicación de que es lo que pasa realmente en el programa.
http://www.diversionesjubilubi.3a2.com/ (http://www.diversionesjubilubi.3a2.com/)
-
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)
-
no creas que nbo he mirado tus post...
ewl domingo te dare respuesta.
-
creo que deberia imprimir:
i=960
o me equivoco?
-
El programa imprime esto:
i=30464
Recuerden checar la direccion de la explicacion del programa anterior...
-
Lo voy a verificar.