PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum bug muito estranho conversao de integer em delphi 7 e 2009 #370530

17/05/2009

0

peguei recentemente em um programa meu a exception de integer overflow.

Eu estava tentando pegar o milissegundo do dia e convertendo para negativo, porque etinha a necesidade de um numero negativo decrescente. Ao invez disso eu estava recebendo um numero positivo pra lá dos 4 bilhoes.

e compilando no delphi 7 e no delphi 2009 encontrei diferenças.


Abaixo vai o código que causa o bug:

[b:5a5a05eb9c]delphi 7[/b:5a5a05eb9c]
procedure TForm1.Button1Click(Sender: TObject);
var
  mili: LongWord;
begin
    mili := MilliSecondOfTheDay(now);

    //muuuuuito estranho: NO DELPHI 7
    ShowMessage(IntToStr(mili));   //isso retorna o positivo corretamente
    ShowMessage(IntToStr(-mili));  //isso não retorna negativo, mas retorna um positivo exageradamente enorme
    ShowMessage(IntToStr(-1*mili)); //isso tambem não retorna negativo, mas retorna um positivo exageradamente enorme
    ShowMessage(IntToStr((-1)*mili));  //isso retorna o negativo corretamente

end;



[b:5a5a05eb9c]delphi 2009[/b:5a5a05eb9c]
procedure TForm1.Button1Click(Sender: TObject);
var
  mili: LongWord;
begin
    mili := MilliSecondOfTheDay(now);

    //muuuuuito estranho: NO DELPHI 2009
    ShowMessage(IntToStr(mili));   //isso retorna o positivo corretamente
    ShowMessage(IntToStr(-mili));  //ISSO DÁ CERTO, MOSTRA NEGATIVO COMO DEVERIA SER
    ShowMessage(IntToStr(-1*mili)); //isso não retorna negativo, mas retorna um positivo exageradamente enorme
    ShowMessage(IntToStr((-1)*mili));  //isso retorna o negativo corretamente

end;


conclusão: estou fazendo algo errado e era pra ser assim mesmo, ou é um bug?

está me parecendo que dependendo de como eu uso os parenteses e o operador ele está considerando o mili como longword, que é um integer gigante unsigned, e não converte para integer, mesmo eu aplicando o sinal de negativo. E se eu tento ele pega o limite superior do longword. Isso nos dois delphis. Mas parece que no delphi 2009 ele converte o longword pra integere se eu negativar, mas no caso -1*mili, no delphi 2009, ele está considerando o operador de multiplicação como precedendo a negativação do 1 ?


Vitor Rubio

Vitor Rubio

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar