a
è un puntatore a una matrice di byte. Se lo si lancia in uint16_t e lo si assegna b
, b
conterrà l'indirizzo della base dell'array (dove è memorizzato) in SRAM. Se si desidera trattare i due byte dell'array a
come un numero intero, utilizzare un'unione come suggerito dall'utente 14284, ma tenere presente che l'unione rappresenterà l'array di byte nell'ordinamento dei byte di memoria dell'architettura (in AVR che sarebbe piccolo -endian, che significa che il byte 0 è il byte meno significativo). Il modo per scriverlo nel codice è:
union{
uint8_t a[2];
uint16_t b;
} x;
x.b[0] = 0x35;
x.b[1] = 0x4A;
// by virtue of the above two assignments
x.a == 0x4A35 // is true
Un altro modo per farlo senza usare un'unione è quello di lanciare a
un puntatore uint16_t e quindi dereferirlo in questo modo:
uint8_t a[2] = {0x35, 0x4A};
uint16_t b = *((uint16_t *) a);
b == 0x4A35; // because AVR is little endian
Se si utilizza il buffer per archiviare dati big endian (ad es. Ordine di byte di rete), sarà necessario scambiare byte per utilizzare una di queste tecniche. Un modo per farlo senza rami o variabili temporanee è:
uint8_t a[2] = {0x35, 0x4A};
a[0] ^= a[1];
a[1] ^= a[0];
a[0] ^= a[1];
a[0] == 0x4A; // true
a[1] == 0x35; // true
Per inciso, questo non è un AVR o addirittura un problema solo incorporato. Livello di applicazione codice di rete scritto per PC tipicamente chiamate funzioni chiamate htonl
, htons
(host rete, 32 e 16 bit varianti) e ntohl
, ntohs
(rete all'host, 32 e 16 bit varianti) le cui implementazioni sono bersaglio architettura dipendente se essi scambiare i byte o meno (supponendo che i byte trasmessi "sul filo" siano sempre big-endian quando fanno parte di parole multi-byte).