Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Два LongWord-а в Double


Автор: zedx 9.2.2010, 22:17
Есть задача получить из 2-х переменных типа LongWord одну Double. 

Придумал вот что:
Код
function GetDouble (Lo,Hi:LongWord):Double;
begin
  asm
    mov [ebp-$08], eax
    mov [ebp-$04], edx
  end;
end;

переводит вроде правильно, но как это без асма сделать?

Автор: Rrader 10.2.2010, 08:01
Асмовский код в таком виде потенциально опасен, не следует адресоваться по жестко вшитым смещениям
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  ALow, AHigh: Integer;
  C: Double; //Int64
begin
  ALow := 10;
  AHigh := 10;
  C := ALow or Int64(AHigh) shl 32;
  ShowMessage(FloatToStr(C));
end;

Автор: Mikel 10.2.2010, 11:11
Что-то мне кажется что такой вариант не подойдет, т.к. это будет просто целое число ;)
Можно так попробовать



Код

function GetDouble (Lo,Hi:LongWord):Double;
var t:packed record Lo,Hi:Longword; end;
begin
t.Lo:=Lo;
t.Hi:=Hi;
Result:=Double(t);
end;


или так...

Код

function GetDouble2 (Lo,Hi:LongWord):Double;
begin
LongWord((@Result)^):=Hi;
PLongWord(LongWord(@Result)+4)^:=Lo;
end;

Автор: zedx 10.2.2010, 13:16
Цитата(Mikel @ 10.2.2010,  11:11)
или так...

Код

function GetDouble2 (Lo,Hi:LongWord):Double;
begin
LongWord((@Result)^):=Hi;
PLongWord(LongWord(@Result)+4)^:=Lo;
end;

Вот, именно то, что я искал. Спасибо.

Автор: Beltar 16.2.2010, 13:50
Более простым для сохранения целостности мозга в процессе понимания, что же код делает, было бы использование вариантной записи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)