This has been mentioned here for the case where two single variables are the same size … Delphi 'absolute'
But it works equally for your case :
{$APPTYPE CONSOLE}
program Project1;
uses
System.Types, System.SysUtils;
type
DW_tuple = array[0..1] of UInt32;
function To_DWords( u:UInt64 ) : DW_tuple; inline;
var
dd : DW_tuple absolute u;
begin
exit( dd );
end;
function To_UInt64( dd:DW_tuple ) : UInt64; inline;
var
u : UInt64 absolute dd;
begin
exit( u );
end;
const
u : UInt64 = $FEDC_BA98_1234_5678;
dd : DW_tuple = ($1111,$2222);
begin
var d2 := To_DWords(u);
writeln('0x', u.ToHexString);
writeln('Ox', d2[0].ToHexString, ' ', 'Ox', d2[1].ToHexString);
writeln;
var u2 := To_UInt64(dd);
writeln('Ox', dd[0].ToHexString, ' ', 'Ox', dd[1].ToHexString);
writeln('0x', u2.ToHexString);
writeln;
readln;
end.
BUT as you can see, just interpreting the same memory leads to rearrangements that you might not expect in the interpretation of each data type.