Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Longitud maxima integer (https://www.clubdelphi.com/foros/showthread.php?t=10149)

cinecito 11-05-2004 18:53:51

Longitud maxima integer
 
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

Cita:

Empezado por cinecito
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...¡¡
 
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

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

Cita:

Empezado por roman
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

Ya vez...
 
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:


La franja horaria es GMT +2. Ahora son las 19:44:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi