• Domingo 15 de Diciembre de 2024, 02:46

Autor Tema:  Error de compatibilidad de datos  (Leído 1242 veces)

Death_13

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Error de compatibilidad de datos
« en: Jueves 9 de Octubre de 2008, 04:15 »
0
Otra vez yo y si con el con el mismo programa de factorial, espero sea la ultima jeje, bueno el problema no es el programa en si, ese ya esta hehcho, aqui el codigo, por si a alguien mas le sirve y pues para que me puedas decir si hay algun error con el codigo motivo de la siguiente pregunta:

El factorial de un numero es el numero multiplicado por sus antecesores por ejemplo:
el factorial de 5 es 120 por lo siguiente:
                   5 X 4 X 3 X 2 X 1 = 120 ó 5 X 4=20, 20 X 3= 60, 60 X 2 = 120 y 120 X 1 = 120,

en teoria mi programa hace eso tu das un numero y el se encarga de enviar a lo ultimo el resultado de ese factorial, hasta hay no hay problema puedes sacar el factorial de 6=720, el de 7=5040, el problema llega cuando deseas sacar el factorial de 8 o mayor ya que el factorial de 8=40,320 y mi programa arroja -25,526 o algo por el estilo jeje y cuando pongo por ejemplo el factorial de 100 solo arroja un cero, no entiendo por que sucede esto, intente cambiar los datos tipo int por doubles, pero como estoy utilizando codigo en ensamblador me marca errores de opcode, ya que los bucles que utilizo son en ensamblador y algunas otras partesillas, como podria cambiar esto? o es que assembler no aguanta otro tipo de valores mas que el int? o tiene error mi codigo?  :brickwall: , bueno espero que puedan despejar mis dudas, y aclaro no es tarea, ni mucho menos una practica solo que deseo programar mas de lo poco que se en assembler combinado con C, y es que buske en algunas paginas pro en ninguna me despejaron esa duda ya que solo me dicen los tipos de datos que soporta C, o C++ pero no assembler con turbo c  :bad:

sin mas rodeos y choro mareador aqui esta el codigo:

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

void main (void)
{
clrscr();
int op, tmp, aux, res, a, b;
Menu:
clrscr();
printf("Programa para calcular el factorial en ASSEMBLERn");
printf("Opcionesn");
printf("[1] Factorialn");
printf("[2] Salirn");
printf("Que deseas hacern");
scanf("%i",&op);

asm{
mov ax,op
cmp ax,1
je Factor
cmp ax,2
je Exit
}
Factor:
clrscr();
printf("Digite el numero a factorarn");
scanf("%i",&a);
printf("Pulse Intron");
b=a;

asm{
mov ax, a
mov tmp,ax
dec a
mov ax,a
mul tmp
}

asm{
mov res,ax
mov ax,tmp
cmp ax,1
je IF1
cmp ax,2
je IF2
sub ax,2
mov tmp,ax
}
asm mov cx,tmp
FRep:
asm{
dec a
mov ax,res
mul a
mov res,ax
mov aux,cx
}

asm mov cx, aux
asm loop FRep
getch();
printf("El factorial de %i es: %in",b, res);
asm jmp Menu
IF1:
printf("El factorial de 1 es: 1n");
asm jmp Exit

IF2:
printf("El factorial de 2 es: 2n");

Exit:
   printf("Pulse una tecla para salirn");
   getch();
}  

Aclaracion, este codigo es 100% escrito por mi heee, asi que no digan que me lo robe, estara todo mal hecho pero lo hice yo  :D  :D  :D  :D  :D  jeje, si ha alguien le sirve es libre de copiarlo(como si necesitara decirlo  :P )

Sin mas espero sus respuestas y pues de antemano gracias espero ya no molestar mas con este codigo... salu2 y en especial a Eternal Idol, gracias por tomart las molestias de contestar mis preguntas  :good:

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Error de compatibilidad de datos
« Respuesta #1 en: Jueves 9 de Octubre de 2008, 19:05 »
0
Pues mira, para empezar, el tipo de dato int, solo permite valores desde -32768 hasta 32767, (es lo que permite almacenar 2 bytes, de los cuales 15 bits son el numero y un bit es para el signo) por eso cuando obtienes el factorial de 8, ocurre lo que se conoce como un "overflow" o desbordamiento, podrias utilizar un "unsigned int", que te permite valores de 0 hasta 65535, pero aun puede ser muy pequeño, en ese caso podrias utilizar un "unsigned long int" que utiliza 4 bytes y te permitiria valores de 0 hasta 4,294,967,295.

Ahora, el usar valores de punto flotante (float o double) es un asunto diferente, el lenguaje ensamblador no maneja directamente esos tipos, solo los tipos enteros, un valor de tipo float se guarda en 4 bytes, de los cuales, una parte es para el exponente, y otra para la mantisa, en el siguiente enlace puedes encontrar mas informacion de como se guardan internamente:

http://es.wikipedia.org/wiki/IEEE_punto_flotante

El lenguaje C/C++ ya incluye dentro de sus liberias las funciones para trabajar con numeros de tipo flotante, y manejar adecuadamente los bits del exponente y la mantisa, pero en ensamblador, tu debes programar esas funciones.

Espero que con eso haya resuelto tus dudas.

Saludos :hola:

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================