fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Variables numericas...
 
Avisos
Vaciar todo

Variables numericas grandes

21 Respuestas
7 Usuarios
0 Reactions
245.2 K Visitas
lacabra25
Respuestas: 84
Topic starter
(@lacabra25)
Trusted Member
Registrado: hace 18 años

Bueno, por el asunto y el resumen seguramente ya estareis imaginando de que va este tema, variables para numeros muy grandes, enormes, de un numero de bits que decida el programador en el momento de programar (y si es posible de un numero de bits que se decida en ejecucion mejor).

Ya tengo conocimientos de programacion en C, y he echo algunos programillas que de momento no han sido gran cosa, he usado la libreria SDL y como anotacion personal me encanta la informatica y cada vez me gustaria programar teniendo mas control sobre lo que programo (a ver si algun dia me animo y me paso por la seccion de ensamblador de este foro para aprender un poco).

Lo que me gustaria saber hacer en C, entre otras cosas, es poder manejar numeros mas grandes de lo que me permite un long o un unsigne long, ¿alguien sabe como o almenos por donde podria empezar a afrontar esta cuestion de variables de numeros grandes?, se que hay multitud de librerias en la red, para esto, para lo otro...; pero me gustaria (igual que hay quien se pone ha hacer librerias ya sea en ensamblador o en C o c++) hacerlo mediante C sin necesidad de usar librerias, se que ahorran trabajo pero es por curiosidad y por saber como hacerlo (y que siempre viene bien saber contra más mejor, y si todos usamos librerias siempre a ver quien se pone a hacerlas despues, jejeje), dejando bromas aparte quisiera saber como manejar numeros muy grandes usando solo C, programandolo manualmente sin complementos ni librerias.

Gracias de antemano a todos por la ayuda que podais brindar y por el tiempo de leeros este tema.

P.D.: en principio no tengo un uso ahora mismo para este tema de numeros muy grandes mas que el de aprender, aunque lo mismo despues si consigo llevar a cabo esta idea de los numeros grandes puede que me anime a aplicarlo en un programa con alguna utilidad y no solo por probar, he leido algunos articulos sobre el algoritmo RSA por lo que podria ser una buena forma de poner en practica el uso de numeros grandes.

Responder
20 respuestas
lacabra25
Respuestas: 84
Topic starter
(@lacabra25)
Trusted Member
Registrado: hace 18 años

eso no es un error, es un aviso, has probado a ejecutar el programa igualmente?

¿pero dev-c++ lo habra compilado despues de en mitad de la compilacion parar y sacar este aviso?, probare a imprimir los dos numeros en pantalla a ver si compila y acepta los numeros.

Bueno, imprimi los dos numeros en pantalla y parece que los acepta, ¿que significa el mensaje de error del compilador?

Por ultimo un detalle, ¿como puedo estar seguro de que el puntero verdaderamente esta haciendo uso de los bits como si de una sola variable se tratara?, la solucion que se me viene a la cabeza en un principio es un bucle que sume 1 a al puntero y a la variable y si fallan a la vez o falla la variable sin que falle el puntero, pero es algo que podria tardar mucho.

Responder
jorcoval
Respuestas: 418
(@jorcoval)
Reputable Member
Registrado: hace 18 años

jorcoval, probe el codigo que posteastes, pero da un pequeño error.
#include <stdio>

main(){
long *p=(long*)malloc(100*sizeof(long));
long a;
*p= 2149999999;
a= 2139999999;
getch();
return 0;
}

Cambie lo del int por long, que creo que deberia de ser lo mismo pero cogiendo unos cuantos bits mas, y en la prueba para comparar use tambien una variable long pero resulta que el puntero y la variable deben de ser del mismo tamaño pues asignando a ambos el numero 2139999999 no da ningun error, pero intentando que el puntero guarde el numero 2149999999 da error, y segun el codigo se supone que el puntero tiene reservados bits suficientes para guardar un numero 100 veces mas grande que un long, y que se deberia poder asignarle al menos 213999999900 al puntero.

No se cual puede ser la causa, los errores que da el compilador son:

6 C:Documents and SettingsadminMis documentosnumeros gigantes.c [Warning] this decimal constant is unsigned only in ISO C90

Sinceramente, no había visto ese warning antes, así que no sé. De todas formas, fíjate que p no es un espacio de memoria lo suficientemente grande para meter un número 100 veces más grande que un long, ES el espacio de memoria suficientemente grande para meter 100 longs. Vamos, lo que has creado es un vector en tiempo de ejecución, pudiendo modificar el tamaño como desees.
Para acceder a dicho espacio de memoria como si todo fuese el mismo número, deberás programar una función apropiada para ello.

Responder
lacabra25
Respuestas: 84
Topic starter
(@lacabra25)
Trusted Member
Registrado: hace 18 años

¿Pero aunque p sea 100 long y sea como un array de longs, puedo usar todos los bytes a la vez como uno solo sin problemas a la hora de realizar las operaciones como suma, resta, multiplicacion y division?, ¿si se puede usar todos los bytes juntos y es como 100 longs, entonces podria guardar un numero igual a 100 multiplicado por el maximo de un long?

¿a alguien se le ocurre algun modo de comprobar que el compilador acepta el codigo de forma que el programa vea el puntero como el lugar de memoria para guardar un numero de x bits y no como array?, esto ultimo es solo para comprobar que el codigo funciona en mi compilador sin que de problemas a la hora de operar o asignarle numeros grandes.

Responder
urriellu
Respuestas: 61
(@urriellu)
Trusted Member
Registrado: hace 18 años

¿Pero aunque p sea 100 long y sea como un array de longs, puedo usar todos los bytes a la vez como uno solo sin problemas a la hora de realizar las operaciones como suma, resta, multiplicacion y division?

Si eso fuese así entonces no existirían librerías diseñadas para hacerlo ni yo te hubiese dicho que necesitas leer libros sobre cómo hacerlo.
¿si se puede usar todos los bytes juntos y es como 100 longs, entonces podria guardar un numero igual a 100 multiplicado por el maximo de un long?

Respuesta corta: No.

Respuesta larga:
Siendo N el número de bits en donde se almacena el valor:
Para números enteros sin signo, su rango es de 0 a (2^N)-1.
Para números enteros con signo, su rango es de -2^(N-1) a (2^(N-1))-1.
Nota: esto no es una regla, en C los tamaños de las variables no están estandarizados así que su tamaño depende del compilador y arquitectura que uses.
¿a alguien se le ocurre algun modo de comprobar que el compilador acepta el codigo de forma que el programa vea el puntero como el lugar de memoria para guardar un numero de x bits y no como array?, esto ultimo es solo para comprobar que el codigo funciona en mi compilador sin que de problemas a la hora de operar o asignarle numeros grandes.

Lo que pretendes hacer supongo que es poder trabajar con variables del tamaño que quieras como si fuesen variables normales. Ya te dijimos varias veces que eso lo mejor es hacerlo con un clase y sobrecargando operadores. Deja de darle vueltas a los punteros que no te van a solucionar nada en especial.

Responder
lacabra25
Respuestas: 84
Topic starter
(@lacabra25)
Trusted Member
Registrado: hace 18 años

Urriellu, lo de usar un puntero es una de las respuestas que publicasteis tambien, si no recuerdo mal la publico jorcoval, y me parecio bastante sencillo hacer un puntero con el numero de bytes que necesite, por eso intente probar esa solucion, pues lo de usar un array es algo que tambien he estado pensando pero antes de decidirme si hacerlo a array pense en probar la idea de los punteros, que es mas sencilla. Si lo de los punteros no funcona lo hare seguramente con un array y creando funciones para manejarlo, lo unico que no entiendo por que no se puede usar un puntero que reserve x bytes de memoria como una sola variable (o por lo menos eso te he entendido en el ultimo mensaje), ¿que impide usar un puntero de un numero de bytes grande como una sola variable y no como array?.

Responder
Página 3 / 5
Compartir: