Vous pouvez "convertir" de hex flotter en utilisant un entier assez grand pour couvrir la valeur flottante utilisée, puis en utilisant le mot-clé ABSOLUTE
. Tout ce que fait réellement est de coder la mémoire de la valeur en entier. Faites très attention d'utiliser des types qui ont exactement la même taille (vous pouvez utiliser SIZEOF
pour trouver la taille de la mémoire d'une valeur). Si vous avez besoin d'une taille impaire, alors absolue par rapport à un tableau d'octets et de boucle à travers et de convertir vers/à partir de chaque octet (ce qui serait deux caractères hexadécimal). Le mot-clé ABSOLUTE
force le démarrage de deux variables à la même adresse mémoire, toute valeur écrite à partir de l'un étant immédiatement disponible dans l'autre.
var
fDecimal : Double; // size = 8 bytes
fInteger : Int64 absolute fDecimal; // size = 8 bytes
begin
fDecimal := 3.14;
ShowMessage(format('%x=%f',[fInteger,fDecimal]));
fInteger := StrToInt64('$1234123412341234');
ShowMessage(FloatToStr(fDecimal)+'='+Format('%x',[fInteger]));
end;
ici est la routine pour les flotteurs avec des tailles impaires:
var
fDecimal : extended;
fInteger : array[1..10] of byte absolute fDecimal;
sHex : string;
iX : integer;
begin
ShowMessage(IntToStr(SizeOf(fDecimal))+':'+IntToStr(SizeOf(fInteger)));
fDecimal := 3.14;
sHex := '';
for iX := 1 to 10 do
sHex := sHex + IntToHex(fInteger[iX],2);
ShowMessage(sHex);
// clear the value
fDecimal := 0.0;
// Reload the value
for iX := 1 to (Length(sHex) DIV 2) do
fInteger[iX] := StrToInt('$'+Copy(sHex,(Ix*2)-1,2));
ShowMessage(FloatToStr(fDecimal));
end;
Le nombre que vous affichez en hexadécimal n'est pas un FLOAT mais un entier de 32 bits. –
Cela correct, je veux savoir comment convertir un entier négatif et aussi comment convertir un float – Makaku00