2010-06-28 7 views

Antwort

9

Ich weiß nicht, was Sie mit ganz rechts und am weitesten links (Endian?) Meinen, aber C garantiert, dass a die 8 niederwertigsten (am wenigsten signifikanten) Bits von b enthält. Das heißt, die Zuordnung entspricht logisch:

a = b % ((uint32_t)UINT8_MAX + 1); 
15

Ja. Gehen Sie folgendermaßen aus:

uint32_t num32 = 0xdeadbeef; 

uint8_t a = num32;  /* 0xef */ 
uint8_t b = num32 >> 8; /* 0xbe */ 
uint8_t c = num32 >> 16; /* 0xad */ 
uint8_t d = num32 >> 24; /* 0xde */ 

Oder diese:

union u 
{ 
    uint32_t num32; 

    struct 
    { 
     uint8_t a; 
     uint8_t b; 
     uint8_t c; 
     uint8_t d; 

    } bytes; 

} converter; 

converter.num32 = 0xdeadbeef; 

Das erste Beispiel ist nicht sind abhängig von Plattform Endianess, hat die zweite .

+0

Während Ihre erste Methode auf allen Compilern und Plattformen funktionieren sollte, ist die zweite Methode auf die Plattform im Little-Endian-Format beschränkt. – Tom

+7

Ja, das habe ich in der Antwort gesagt, oder? –

0

Sie könnten sich die union declaration ansehen. Wenn Sie garantieren können, dass der Prozessor/die Datenquelle sich nicht ändert, denke ich, können Sie davon ausgehen, dass endianness

5

Vom C-Standard ist garantiert, dass a == b % (max_of_uint8_t + 1), d. H. Die am wenigsten signifikanten 8 Bits. In § 6.3.1.3 (mit und ohne Vorzeichen ganze Zahlen):

  1. Wenn ein Wert mit Integer-Typ in einem anderen Integer-Typ umgewandelt wird, anders als _Bool, wenn der Wert durch den neuen Typen dargestellt werden kann, ist es unverändert .
  2. Wenn der neue Typ nicht vorzeichenbehaftet ist, wird der Wert konvertiert, indem wiederholt ein Wert um den Maximalwert, der im neuen Typ dargestellt werden kann, addiert oder subtrahiert wird, bis der Wert im Bereich des neuen Typs liegt.

Verwenden a = b & 0xff wenn Sie sicher sein.

Verwandte Themen