Anuncios Google

como declarar un INT enorme en ANSI C?

Holaa todos..

estoy tratando de trabajar con enteros

y tengo un "unsigned long long int" ... pero cuando supera aproximadamente la barrera de 2.000.000.000  , no funciona como quiero, y me tira numros negativos.

tengo entendido que con unsigned long tendria que tener hasta 4.000.000.000... hay alguna más grande? porque , justmaente, tengo qu trabajar con enteros de 10 cifras (como minimo)

por favor tirenme ideas o como hacerlo para trabajar con 10 cifras, muchas gracias, espero respuestas!


----------PSP---------

PSP 2001 Piano Black- placa ta-085 v2 .. desde OF 3.95 pasando por 3.9M33, 5.00M33, {muchos más} GEN, y actualmente Neur0n 6.38

 

---------ANDROID ***Nuevo ;) *** ------

Samsung Galaxy S Captivate de Rogers Canada {SGH-896} (Es identico al SGH-897 de USA)

Rooteado, LIBERADO POR MI funcionando en Argentina (dudas, MP)

Rom Phoenix Ultimate.. esperando CM7 estable :)


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de joserc87

Long Int

Si la variable es unsigned no deberían salirte números negativos. Mira que no estás realizando un casting a signed (explícito o explícito). Un long long int te daría enteros de 64 bits, es decir que podriás tener numeros de hasta 18.446.744.073.709.551.616 (sin signo) aunque por lo que cuentas te los da de 32 bits, segúramente porque usas Linux de 32 bits o windows. De esos 32 realmente en tu programa estás utilizando 31 bits ya que en algún sitio estás convirtiendo a entero con signo. Los procesadores de 32 bits no pueden realizar operaciones con 64 bits ya que los datos no entran en los registros, o visto de otra manera, la ALU del procesador es de 32 bits y no puede operar con datos de 64. Tendrás que hacer operaciones más complejas a mano. Por ejemplo para sumar dos datos de 64 bits, divides los datos en 2 variables de 32 bits, sumas la parte menos significativa, miras el acarreo, sumas la parte más significativa y le sumas 1 (si hay acarreo) y finalmente la suma será 2^32*a+b donde a es la parte más significativa de la suma y b es la menos significativa.

No obstante puede que todo esto no te baste y necesites enteros más grandes: Para aplicaciones como criptografía los enteros grandes son muy utilizados. Java tiene una biblioteca estandar para esto pero C no. De todas maneras hay bilbliotecas, aunque no estandar. Busca Big Integer en google. Para C++ hay incluso clases que te facilitan las cosas. Hay multitud de librerías, incluso en los repositorios de debian creo que había alguna.

Por supuesto, si no necesitas que sean números enteros y te puedes conformar con reales, declara un double, que te redondea, pero puede trabajar con números enormes.

¿Para qué necesitas los enteros grandes?


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Gracias por responder! como

Gracias por responder! como dijist epor ahi, estbaa experimentando en una ESPECIE de encriptador.

Antes de leer e interiorizarme en el tema (que me interesa) queria arreglarmelas para sin tanto conocimiento en algoritmos de encriptacion y eso, poder hacer algo que encriptara archivos o cosas asi.. el unico problema que tenia era que me veiia forzado a usar claves menores a 7 digitos por este asunto (hice un algoritmo para "hash" -aclaro, lo hice antes de siquiera saber que se llamaba hash xD se me ocurrio de 0 jaj-  , y resulta que daba cosas mu grandes)

ya lo descontinue al "proyecto", por falta de tiempo . . .cuando este año empiece ingenieria en sistemas, lo retomare para practicar jaj...

gracias por todas las indicaciones, las guardaré como notas para la proxima version que haga, gracias!


----------PSP---------

PSP 2001 Piano Black- placa ta-085 v2 .. desde OF 3.95 pasando por 3.9M33, 5.00M33, {muchos más} GEN, y actualmente Neur0n 6.38

 

---------ANDROID ***Nuevo ;) *** ------

Samsung Galaxy S Captivate de Rogers Canada {SGH-896} (Es identico al SGH-897 de USA)

Rooteado, LIBERADO POR MI funcionando en Argentina (dudas, MP)

Rom Phoenix Ultimate.. esperando CM7 estable :)

Imagen de pspgorrister

Los procesadores de 32 bits

Los procesadores de 32 bits no pueden realizar operaciones con 64 bits ya que los datos no entran en los registros. , la ALU del procesador es de 32 bits y no puede operar con datos de 64. Tendrás que hacer operaciones más complejas a mano

 

No es del todo correcto, esa afirmación es confusa. ¿Entonces con los micros de 8 bits no se podían realizar operaciones con números mayores de 256, o los de 16 con números mayores 65535?. Por ejemplo a nivel más bajo hay operaciones que se guardan en 2 registros de 32bits como EDX:EAX esto lo hace de forma nativa un micro de 32, así que puede manejar 64bits sin problemas (idem con los ejemplo de antes de 8 y 16bits). Si el micro no pudiera, lógicamente, no podría hacerlo ningún otro lenguaje de alto nivel como C o Java (por más que digan el único de bajo nivel es el ensamblador).

Y según ANSI C un "long long int" es de 64bits da igual si se compila en 32bits (el "long int" es el de 32bits). Lo he consultado y es así, lo que no comprendo es porqué no le va.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de joserc87

Ups.

Presupuse que no se podía. Desconocía que hubiese ese tipo de operaciones. Creía que ese tipo de operaciones se tenía que descomponer en otras más básicas a la hora de generar el código objeto. Aunque supongo que a nivel interno del procesador hará lo mismo que he dicho antes, operar por partes descomponiendo la operación en varias micro-operaciones básicas, aunque de forma algo más eficiente. Alguna ventaja tenían que tener los CISC :D.

Pues entonces no se porqué no le funciona. Puede ser un error de código, como por ejemplo que la variable sea long long int pero almacene temporalmente el dato en un int o que a la hora de hacer printf () ponga d en lugar de ld.

Saber el código, la arquitectura y el compilador ayudaría...

 


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de pspgorrister

En ANSI C, el tamaño del

En ANSI C, el tamaño del entero depende de la arquitectura esto se puede ver en "limits.h" con el valor ULONG_MAX, si es de 32bits el máximo que podrás como ya te han dicho, será de +4.294.967.295, mientras que en 64bits es de +18.446.744.073.709.551.615. Me parece que ANSI C tenía el tipo unsigned long long int que has comentado, pero si dices que no te funciona, no se... puede que me equivoque y no sea una cifra de 64bits, así que pasamos al plan B:

Te puedo dar una solución pero no es ANSI, se sale de dicho estándar.

  • Si usas el compilador GNU, añade el archivo inttypes.h y usa el tipo uint64_t
  • Si usas el compilador del lado del mal.. xD. usa el tipo unsigned__int64 (este no sé en que header se encuentra).

Suerte y ya nos cuentas cómo lo has conseguido.

 


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

MM---

unsigned long double ??? no se si se hará así o no, pero yo una vez lo hice así, aunque claro, no se hasta donde puede llegar jj, pero siempre se pueden hacer funciones para aumentar el tamaño de los numeros infinitamente...

EDITO: unsigned long int --> 0 a 4294967296

Un saludo desde Miguel Software.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.