¿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);
| |||
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); |
| |||
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::
como se ve, al superar por arriba el límite se vuele a empezar de nuevo Ver original |
| |||
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 |
| |||
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); |
| |||
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. |
| |||
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 |
| |||
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: |