PDA

Ver la Versión Completa : Longitud maxima integer


cinecito
11-05-2004, 18:53:51
var digitos: int64;
begin
digitos := 21011715373203075755142800;
.......
end;


Me da el error "21011715373203075755142800, is not valid integer value"

Alguien sabe porque, si he leido que int64 es 2 elevado a 68 como es posible que no abarque ese rango?

delphi.com.ar
11-05-2004, 18:57:26
9223372036854775807 {Valor máximo de un Int64 (High(Int64))}
21011715373203075755142800 {Tu valor}

roman
11-05-2004, 18:59:32
como es posible que no abarque ese rango?

¿Será porque 2^68 es bastante menor que 21011715373203075755142800?

// Saludos

cinecito
11-05-2004, 19:03:45
Ok, entonces como tengo que declarar esa variable?

delphi.com.ar
11-05-2004, 19:08:21
¿Vas a necesitar hacer cálculos sobre este tipo de datos?

roman
11-05-2004, 19:08:31
Para manejo de enteros tan grandes me parece que tendrás que usar el tipo TBcd de la unidad FmtBcd. El problema es que toda la aritmética para estos valores tendrás que hacerla mediante funciones especiales (busca BCD en la ayuda de Delphi) y no será muy conveniente si deseas gran rapidez de cálculos.

// Saludos

cinecito
11-05-2004, 19:43:17
Veamos, lo que necesito es calcular el código IBAN asociado al país, éste es mi procedimiento:

procedure TForm1.TButtCalculaIBANClick(Sender: TObject);
var
dividendo,divisor,iban,cuenta: string;
resto,resultado:int64;
i:smallint;
begin
cuenta := '21001715370200075755142800';
i:=0;
divisor:='97';
i:=length(divisor);
dividendo:=copy(cuenta,0,i);
while strtoint64(dividendo) < strtoint(divisor) do
begin
i:=i+1;
dividendo:=copy(cuenta,0,i);
while (i < length(cuenta) ) do
begin
resto:=strtoint64(dividendo) mod strtoint(divisor);
i:=i+1;
dividendo:=inttostr(resto)+copy( cuenta,i+1,(i) );
end;
resto:=strtoint64(dividendo) mod strtoint(divisor);
resultado:=(98-resto);
end;
EdtIBAN.Text:=inttostr(resultado);
end;

... Y el problema lo tengo a la hora de asignarle a la variable los 20 dígitos de la cuenta + 142800. ¿Existe otra manera de calcular este código en delphi?

He probado lo del bcd y la verdad es que se complica un poco, debe haber otra manera más sencilla de resolverlo.

Saludos.

sanxpue
11-05-2004, 20:02:14
Sera que eres paisano de Nopatic.. hizo la misma pregunta y hasta me invito a desayunar, espero que tambien me invites por que te sacare del mismo problema....

checate esta link http://www.clubdelphi.com/foros/showthread.php?t=8922 (http://)

si te sirve nada mas junto otros 10 y ya estare en España desayunando gratis... :D

delphi.com.ar
11-05-2004, 20:55:23
no será muy conveniente si deseas gran rapidez de cálculos.
Un comentario: los cálculos con Int64 tampoco son muy veloces, ya que no se trata de un tipo de dato nativo de procesadores de 32bits, que es el código que compilan las versiones 2, 3, 4, 5, 6 y 7 de Delphi. El tipo Int64 es un tipo “simulado” por el compilador, pueden verlo debugueando el código compilado de una división de Int64, y verán como en lugar de hacer un div, se llama a una subrutina llamada _lldiv (esta declarada en System), que hace varios pasos para hacer una simple división. En System.pas hay toda una sección donde se definen "64-bit Integer helper routines".

Saludos!

cinecito
12-05-2004, 00:46:22
Muchas gracias!

Efectivamente Sanxpue, esa funcion va de maravilla, justo lo que necesitaba gracias tambien a Roman y Federico por su ayuda.

Por cierto, lo del desayuno sigue en pie, no conozco a Nopatic pero vivo cerca de Valencia, asi que si un dia estás dispuesto a cruzar el charco ya sabes q mas de uno estaría encantado con un invitarte a un desayuno,jeje....

Saludos.

sanxpue
12-05-2004, 03:06:22
Te dije que te iba a servir..pero nada mas me faltan otros 5 para que sea completa la semana...y otros 7 para la comida y otros 7 para la cena y otro pal hospedaje.. osease que ya falta poco.. ahora si me quieres ayudar como yo, diles a tus amigos programadores que pongan la misma pregunta jejejeje :confused: