Pregunta sobre el tipo integer

1 view
Skip to first unread message

Martin Javier Morello

unread,
Apr 22, 2008, 5:46:13 PM4/22/08
to pasc...@googlegroups.com
Hola Gente, estoy haciendo unas pruebas con Free Pascal y obtuve unos resultados fuera de lo esperado:

Hice una función factorial en una unit y un programa principal en donde llamo a la función factorial. La función retorna un integer. Según tenía entendido este tipo de datos reserba 2 bytes y por lo tanto el mayor valor que puede almacenar es 32767. Bueno, resulta que mandé a calcular el factorial de 10 y me dá 3628800 lo cual es correcto, pero la pregunta es: este valor no supera los 32767 que puede contener un integer ????

Les adjunto la unit y el programa principal. Si alguien me puede explicar que está sucediendoooooo....?????

Estoy compilando con FreePascal sobre Windows 2000.

Gracias !!!

Martín.
miUnit.pas
testMiUnit.pas

Gonzalo Soriano

unread,
Apr 22, 2008, 9:47:26 PM4/22/08
to Pasc...@googlegroups.com
Hice 2 pruebas, el factorial de 5 y el de 10.

Ingrese un valor: 5
El factorial de 5 es: 120

y

Ingrese un valor: 10
El factorial de 10 es: 24320

Por lo que a mi no me da lo que vos decís. Por lo que tenía entendido y confirme en un una wiki de freePascal[1], el rango de las variables puede cambiar dependiendo de la arquitectura en la que lo compiles. Supongo que tendrás un compilador de 64 bits, por eso es que a vos te da ese número y a mi (con uno de 32 bits) me da 24320.

Salu2, Gonzalo

[1]: http://wiki.freepascal.org/Integer

Martin Javier Morello <mjmo...@gmail.com> escribió:


Los referentes más importantes en compra/venta de autos se juntaron:
Demotores y Yahoo!. Ahora comprar o vender tu auto es más fácil.
Visitá http://ar.autos.yahoo.com/

Pablo Augusto Sznajdleder

unread,
Apr 23, 2008, 1:49:35 PM4/23/08
to Pasc...@googlegroups.com
Hola Javier, Gonzalo: el tema es así:

Factorial de 5 es: 5*4*3*2 = 120
Factorial de 10 es: 10*9*8*7*6*5*4*3*2 = 3628800

que coincide con lo que decía Javier. 

Lo que dice Gonzalo es cierto: El integer tiene 2 bytes en DOS compilando con Turbo Pascal. Pero aparentemente en Win32, con un compilador más moderno como FreePascal el integer tiene 4 bytes y en 4 bytes con signo podés almacenar valores de hasta 2^31 (muuuuy graaaandeeeesss).

De hecho, esto lo podés probar con la función sizeof (no se si existe en Turbo Pascal, pero en FreePascal funciona).

El resultado que le tira a Gonzalo, que dice que factorial de 10 es 24320 es incorrecto, simplemente hagan la cuenta con cualquier calculadora para verificarlo. Pero le tira este error porque lo debe haber compilado con Turbo Pascal y Turbo le asigna 2 bytes al integer con lo que la variable "se desborda" y entonces almacena cualquier cosa.

Les adjunto un ejemplo de como usar esta función.

En la materia "Algoritmos y Estructuras de Datos" consideramos siempre que el integer tiene 2 bytes.

Saludos ,
Pablo.


2008/4/22 Gonzalo Soriano <gonzalo...@yahoo.com.ar>:



--
Ing. Pablo Augusto Sznajdleder_________
(5411) 4637-8879 | 15-4419-JAVA (5282)

email: pab...@pablosz.com.ar
skype: pabloszn
http://www.PabloSZ.com.ar
http://www.JavaSOS.com.ar
TestSize.pas

Gonzalo Soriano

unread,
Apr 23, 2008, 2:44:38 PM4/23/08
to Pasc...@googlegroups.com
Hola, sabía que el resultado no es ese, pero no creí necesario ponerlo ya que Javier había dicho que el resultado no era el correcto.
Supongo que debe ser por la arquitectura y no por el compilador, ya que yo también uso el Free Pascal, pero la versión que es para Linux. Creo que los integer no se define con un tamaño en bytes, sino con el tamaño de la "palabra"[1] (en realidad media palabra) en esa arquitectura, 32 bits para uno y 64 para el otro.
En "Algoritmos y Programación I" también usamos los enteros de 16 bits.

Salu2, Gonzalo.

[1]: Con palabra me refiero a http://es.wikipedia.org/wiki/Palabra_%28inform%C3%A1tica%29.


Pablo Augusto Sznajdleder <pab...@pablosz.com.ar> escribió:


Yahoo! Encuentros
Ahora encontrar pareja es mucho más fácil, probá el nuevo Yahoo! Encuentros.
Visitá http://yahoo.cupidovirtual.com/servlet/NewRegistration

AAdamoli

unread,
Apr 26, 2008, 12:22:53 PM4/26/08
to PascalSOS
Recomendación:
Para verificar que cantidad de bytes ocupa cada tipo de dato, escriban
un programa que muestre el sizeof de cada tipo de dato.
Por ejemplo
writeln('cantidad de bytes del tipo de dato integer: ', sizeof
(integer));
Saludos Adriana


On 22 abr, 18:46, "Martin Javier Morello" <mjmore...@gmail.com> wrote:
> Hola Gente, estoy haciendo unas pruebas con Free Pascal y obtuve unos
> resultados fuera de lo esperado:
>
> Hice una función *factorial* en una *unit* y un programa principal en donde
> llamo a la función *factorial*. La función retorna un *integer*. Según tenía
> entendido este tipo de datos reserba 2 bytes y por lo tanto el mayor valor
> que puede almacenar es 32767. Bueno, resulta que mandé a calcular el
> factorial de 10 y me dá 3628800 lo cual es correcto, pero la pregunta es:
> este valor no supera los 32767 que puede contener un integer ????
>
> Les adjunto la unit y el programa principal. Si alguien me puede explicar
> que está sucediendoooooo....?????
>
> Estoy compilando con FreePascal sobre Windows 2000.
>
> Gracias !!!
>
> Martín.
>
>  miUnit.pas
> 1 KDescargar
>
>  testMiUnit.pas
> 1 KDescargar
Reply all
Reply to author
Forward
0 new messages