Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Positivo pasa a Negativo

Estas en el tema de Positivo pasa a Negativo en el foro de C/C++ en Foros del Web. ¿Cómo es posible que un contador long que sólo incremento en mi programa, a la hora de imprimirlo por pantalla, salga negativo? numero_muestras es tipo ...
  #1 (permalink)  
Antiguo 22/09/2010, 13:15
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 13 años, 8 meses
Puntos: 0
Positivo pasa a Negativo

¿Cómo es posible que un contador long que sólo incremento en mi programa, a la hora de imprimirlo por pantalla, salga negativo?

numero_muestras es tipo long

printf("%d\n", numero_muestras);
  #2 (permalink)  
Antiguo 22/09/2010, 15:02
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: Positivo pasa a Negativo

vale. todos los numeros tienen un límite, tanto por arriba como por abajo. pongamos que hay un tipo que si max es 1000 y el min -1000(ambos incluidos)
Código el resultado::
Ver original
  1. por ejemplo, x=999
  2. x++
  3. x==1000
  4. x++
  5. x==-1000
como se ve, al superar por arriba el límite se vuele a empezar de nuevo
  #3 (permalink)  
Antiguo 22/09/2010, 15:11
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Positivo pasa a Negativo

Y como es posible que se desborde un long en c??

Se sabe hasta donde que número puede llegar? vale que se pase de 1000, pero supongo que long irá mucho más lejos
  #4 (permalink)  
Antiguo 22/09/2010, 16:00
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Positivo pasa a Negativo

Obviamente que se puede desbordar un long. NO uniendo todas las memorias del mundo se podria hacer un numero que no se desborde...

Tu problema puede estar que la forma de representar los numeros y los bits que ocupan son distintos. Por ejemplo los enteros ocupan 32 bits. Y se representan mediante el complemento a dos

Por otro lado los float se representan totalmente distinto pero ocupan la misma memoria. Basicamente se reservan bits para la base y bits para el exponente. Bien no me acuerdo ahora. Asi que si vos le decis al printf que imprima un entero pero le pasas un float seguramente va a imprimir cualquier gansada. Ya que tienen distintas representaciones.

Asi que estimo que el long se representan de cierta forma que desconosco y debe ocupar mas que un entero. Asi que posiblemente toma una parte del entero y la representacion de esa parte hacia entero es basura.

Asi que mejor indicale al printf que imprima lo siguiente:
printf("el resultado es %ld",resultado);
  #5 (permalink)  
Antiguo 22/09/2010, 19:00
Avatar de donyoyo  
Fecha de Ingreso: mayo-2010
Ubicación: Chile
Mensajes: 31
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Positivo pasa a Negativo

estimados:
dependiendo de la implementación de C que tengan en la maquina, existe siempre una libreria denominada "limits.h" que indica cual es la cantidad de bytes que ocupa cada tipo de datos, asi como su limte inferior y superior.
espero les sirva esta info.
  #6 (permalink)  
Antiguo 23/09/2010, 01:48
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Positivo pasa a Negativo

Como ya comenté en un tema anterior que posteaste, indica el sistema operativo y compilador que utilizas.

Postea también tu código, porque el printf que has puesto es correcto. Habría que ver dónde y cómo calculas esa variable.
  #7 (permalink)  
Antiguo 23/09/2010, 06:57
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Positivo pasa a Negativo

Utilizo Windows XP y compilador Turbo c++, programo en lenguaje c, no c++.

Si lo dejo con int y float ocurre que alguna vez en alguna simulación da un error que pienso que tien que ver con el desbordamiento, y si pongo los long y double alguna variable se pinta mal como indico en este post.

Un contador que sólo Incremento, acaba saliendo negativo.

Sam* para long dices que mejor ponga %ld y ¿para los double?

Un saludo
  #8 (permalink)  
Antiguo 23/09/2010, 11:22
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Positivo pasa a Negativo

Proba con "%lf".

Y si no, postea tu codigo!!
  #9 (permalink)  
Antiguo 24/09/2010, 02:34
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Positivo pasa a Negativo

Si usas Turbo C++, es probable que sea un compilador de 16 bits. Haz la prueba mediante el operador sizeof. printf("%d", sizeof(int)) te dará como resultado 2 si el compilador es de 16 bits, y 4 si es de 32.

Acerca del otro fallo, tendrías que postear código a ver si se descubre algo. Dado que hablas de simulación, intuyo que puede haber gran cantidad de iteraciones de algo, que pueden desbordar con facilidad un entero de 16 bits.

Otra posibilidad es que esa variable que se te desborda la estés utilizando antes de iniciarla a un valor. Las variables globales o las declaradas con el atributo static dentro de las funciones casi siempre se inician a 0 si no se les asigna un valor explícito, aunque hay excepciones. Las variables declaradas normalmente dentro de una función casi nunca se inician a valor alguno, y tendrán el valor que corresponda al contenido de la memoria que ocupan (es decir, valores basura), aunque también puede haber excepciones. Comprueba que no sea este tu caso, podrías encontrarte con que esa variable empieza teniendo un valor alto o incluso ya negativo.

Si el compilador es de 16 bits, utiliza %ld para long. Para double utiliza %lf.
Si el compilador es de 32 bits, da igual %d y %ld. Para imprimir te vale %f tanto para float como para double, pero tendrás que emplear %lf en scanf para double.

Etiquetas: negativo, positivo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:55.