Pequenas Diferenças entre Delphi 7 e Delphi 2009
Esta é apenas uma dica das diferenças entre os dois compiladores ao se trabalhar com inteiros negativos.
Analisando as diferenças entre o Delphi 7 e o novo Delphi 2009 podemos ver que elas não se limitam apenas a diferenças de componentes ou bibliotecas. Alem das diferenças da própria linguagem, temos algumas diferenças de sintaxe. Nos exemplos abaixo mostrarei alguns exemplos de cálculos com números negativos que gerariam a exception de Integer Overflow no Delphi 7, mas que no Delphi 2009 funcionam perfeitamente.
Abaixo os comentarios estão separados por pipes "|". A esquerda comentei o resultado da função em Delphi 7 e a direita em delphi 2009. Teste nas duas versões.
{
Esse pequeno programa demonstra um erro de integer ovrflow que ocorre diferente
entre o delphi 7 e o 2009.
Esse erro ocorre ao se declarar um int, porem tentar armazenar nele a multiplicação
de -1* um numero do tipo longword (unsigned).
O operador de multiplicação terá precedência sobre o unario de negativação e será negativado
um número unsigned, fazendo com que seu bit mais significativo seja ativado e tornando-o enorme.
O interessante da diferença entre o Delphi 7 e o 2009 é que no Delphi 2009, ao contrario do delphi 7,
a negativação do longword automaticamente o converte para um integer. Porém, ao se multiplicar
-1*[longword] o efeito é o mesmo obtido no delphi 7: ativação do bit mais significativo
do longword resultando em um numero enorme.
Para contornar esse problema, alem do número -1 precisar ser isolado entre parenteses
para o operador de negativação ter maior precedência, sempre é bom converter o longword
para integer, se possivel.
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DateUtils;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
mili: LongWord;
begin
mili := MilliSecondOfTheDay(now);
//NO DELPHI 7: |NO DELPHI 2009:
ShowMessage(IntToStr(mili)); //retorna o positivo corretamente |retorna o positivo corretamente
ShowMessage(IntToStr(-mili)); //não retorna negativo, mas retorna um positivo exageradamente enorme |ISSO DÁ CERTO, MOSTRA NEGATIVO COMO DEVERIA SER
ShowMessage(IntToStr(-1*mili)); //isso tambem não retorna negativo, mas retorna um positivo exageradamente enorme |isso não retorna negativo, mas retorna um positivo exageradamente enorme
ShowMessage(IntToStr((-1)*mili)); //isso retorna o negativo corretamente |isso retorna o negativo corretamente
end;
procedure TForm1.Button2Click(Sender: TObject);
var
mili: LongWord;
begin
mili := MilliSecondOfTheDay(now);
//FUNCIONA IGUAL TANTO NO NO DELPHI 7 COMO NO 2009
ShowMessage(IntToStr(mili*-1)); //funciona, traz negativo
ShowMessage(IntToStr(mili*(-1))); //funciona, traz negativo
end;
end.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo