![]() |
AW: Vorzeichenbehaftete Zahlen und Endianess
Wer liest denn die Hilfe?
(außer sie heißt
Delphi-Quellcode:
)
dont read me.doc
|
AW: Vorzeichenbehaftete Zahlen und Endianess
Zitat:
Zitat:
|
AW: Vorzeichenbehaftete Zahlen und Endianess
Zitat:
Das 2. und 3. Byte bezeichnen in diesem Zusammenhang aber eben die Lo-Bytes. Swap vertauscht in dem Integer die beiden niedrigen Bytes, als wäre es ein Word. Insofern ist das Verhalten schon konsistent. Die Nummerierung der Bytes bezieht sich offenbar auf das verlinkte Beispiel.
Delphi-Quellcode:
var
X: Integer; begin X := $A0B1C2D3; Assert(Swap(X) = $A0B1D3C2); end; |
AW: Vorzeichenbehaftete Zahlen und Endianess
Aber das ist doch nicht das, was man will (und erwartet), wenn die vier Byte eines Integers vertauscht werden sollen?!
|
AW: Vorzeichenbehaftete Zahlen und Endianess
Zitat:
Zitat:
|
AW: Vorzeichenbehaftete Zahlen und Endianess
Zitat:
und gerade in THash hätte ich nicht nach sowas gesucht ... eher in den Helpern der ordinalen Typen. Jupp, wenn ich im CodeInsight das Integer sehe, denkt man zu schnell, dass das Delphi-Swap die Kapselung des Assembler-BSWAP ist und das dreht sowohl bei Word, also auch Integer alle Bytes um, jenachdem was man als Register reingibt. (z.B. AX oder EAX und vielleicht sogar auch RAX) Aber gerade bei diesen beiden System-Units muß man immer doppelt hinsehn. Auch bei der Compiliermagic zeigt's CodeInsight dort hin, selbst wenn es garnicht dort liegt und da wird es noch schlimmer. |
AW: Vorzeichenbehaftete Zahlen und Endianess
Da finde ich gerade bei Stackoverflow Folgendes:
Delphi-Quellcode:
von unserem Freund David Heffernan.
function ByteSwap64(Value: Int64): Int64;
asm {$IF Defined(CPUX86)} mov edx, [ebp+$08] mov eax, [ebp+$0c] bswap edx bswap eax {$ELSEIF Defined(CPUX64)} mov rax, rcx bswap rax {$ELSE} {$Message Fatal 'ByteSwap64 has not been implemented for this architecture.'} {$ENDIF} end; Tatsächlich "rax". |
AW: Vorzeichenbehaftete Zahlen und Endianess
Zitat:
Endianess ist ja die Byte-Reihenfolge. D.h. gedanklich als ersten Schritt muss man die Bytes in die richtige Reihenfolge bringen. Dann, als 2. Schritt weißt du wo das most significant bit ist und kannst (für einen Integer) das Vorzeichen ablesen. Für die Endianess kannst du also vorzeichenbehaftete und unbehaftete Werte völlig gleich behandeln. Daher wirst du auch nur wenig Code extra für vorzeichen finden - schlicht weil das Vorzeichen (noch) keine Rolle spielt. Was wichtig ist: Wieviele bits hat der Wert. Zitat:
Bei einer 1-Byte Zahl hat das linke bit entweder einen Wert von 128 (ohne Vorzeichen) oder -128 (mit Vorzeichen) Würde man sich tatsächlich nur auf das Vorzeichen beschränken, wäre ein signed byte auf +- 127 limitiert und könnte -128 nicht darstellen. Dafür hätte man eine +0 und eine -0. Irgendwann früher mal hat wohl jemand zwei Nullen für überflüssig befunden und dem linken Bit dann diese Bedeutung zugewiesen. |
AW: Vorzeichenbehaftete Zahlen und Endianess
Jupp, mit einem Vorzeichenbit wäre es ein Wert weniger, da die 0 doppelt ist.
PS: Siehe Fließkommazahlen IEEE-754 ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz