Einzelnen Beitrag anzeigen

Benmik

Registriert seit: 11. Apr 2009
542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Vorzeichenbehaftete Zahlen und Endianess

  Alt 22. Jul 2020, 12:32
@Neutral General:Tja, du hast recht. Es geht um Folgendes:
Delphi-Quellcode:
  procedure Test;
  var ArrNum:array of Byte;
  begin
    ArrNum := [00,00,00,08];
    i := PInteger(@ArrNum[0])^;
  end;
Da kommt 134217728 heraus. Ich muss aber auf den Wert 8 kommen.
Ich habe eine Routine zum Umdrehen der Bytes eingesetzt, die ich aus einer umständlichen Vorlage kondensiert habe:
Delphi-Quellcode:
function SwapArray(Arr:TBytes):TBytes;
var i,n:integer;
begin
  SetLength(Result,Length(Arr));
  n := Length(Arr) - 1;
  For i := 0 to n do
    Result[n - i] := Arr[i];
end;
Außerdem hatte ich folgenden Schnipsel:
Delphi-Quellcode:
function BigEndian2LittleEndian(aInt: integer): integer;
asm
  xchg ah, al;
  rol eax, 16;
  xchg ah, al;
end;
Warum das heute funktioniert und gestern Nacht nicht, ist vermutlich deinem Einfluss und dem der Sterne zu verdanken. Daneben hatte ich noch Result:= Wert xor $80000000; , das offenbar mit Integern nicht funktioniert.

Die ASM-Funktion wird vermutlich nicht mit Int64 funktionieren? (Bei meiner langen, unnötigen Suche kam ich auf das Stichwort "rax").

@Himitsu: Ja, mit genau solchen Dingen, die ich (noch) nicht so richtig kapiert habe, habe ich mich Stunden herumgeschlagen und offenbar den einfachen Weg übersehen. Möchte hinzufügen, dass ich die Byte-Repräsentation von SmallInt etc. natürlich verstehe; aber wie z.B. die das machen, dass ein Integer genauso viele Werte aufnehmen kann wie ein Cardinal trotz des Vorzeichenbytes, das verstehe ich nicht so richtig und muss es auch nicht. Und dann habe ich noch von Feinheiten bis runter zur CPU gelesen - nee, das sollen die Profis unter sich ausmachen.

Geändert von Benmik (22. Jul 2020 um 13:21 Uhr)
  Mit Zitat antworten Zitat