Meine Frage sieht sehr ähnlich aus
So speichern Sie eine 64-Bit-Ganzzahl in zwei 32-Bit-Ganzzahlen und konvertieren sie wieder zurück
(Ich habe ein vorzeichenloses 32-Bit, das ich in 4 vorzeichenlose 8-Bit-Variablen in C setzen muss)
aber
Meine Frage ist, ob das:
%Vor%garantiert, dass a mit den acht rechten Bits statt mit den acht Bits ganz links gefüllt wird?
Ja. Tun Sie dies entweder:
%Vor%Oder das:
%Vor%Im ersten Beispiel ist nicht von der Endlichkeit der Plattform abhängig, das zweite ist .
Ich weiß nicht, was Sie mit ganz rechts und ganz links meinen (Endian?), aber C garantiert, dass a
die 8 niedrigstwertigen (niedrigstwertigen) Bits von b
enthält. Das heißt, die Zuweisung entspricht logisch:
Aus dem C-Standard ist garantiert, dass a == b % (max_of_uint8_t + 1)
, d. h. die niedrigstwertigen 8 Bits. In §6.3.1.3 (Ganzzahlen mit und ohne Vorzeichen):
- Wenn ein Wert mit Integer-Typ in einen anderen Integer-Typ als
_Bool
konvertiert wird, ist der Wert unverändert, wenn der Wert durch den neuen Typ dargestellt werden kann.- Andernfalls, wenn der neue Typ nicht vorzeichenbehaftet ist, wird der Wert durch wiederholtes Addieren oder Subtrahieren von mehr als dem maximalen Wert, der im neuen Typ dargestellt werden kann, konvertiert, bis der Wert im Bereich des neuen Typs liegt.
Verwenden Sie a = b & 0xff
, wenn Sie sicher sein müssen.
Sie können sich die Gewerkschaftserklärung ansehen. Wenn Sie garantieren können, dass sich der Prozessor / die Datenquelle nicht ändert, kann ich davon ausgehen, dass Sie endianness "
annehmen können