a
adalah pointer ke array byte. Jika Anda melemparkannya ke uint16_t dan menetapkannya b
, maka b
akan berisi alamat basis array (tempat disimpannya) di SRAM. Jika Anda ingin memperlakukan dua byte array a
sebagai integer, maka gunakan union seperti yang disarankan oleh user14284, tetapi perlu diketahui bahwa union akan mewakili array byte dalam pemesanan byte memori arsitektur (dalam AVR yang akan sedikit -endian, yang berarti byte 0 adalah byte paling signifikan). Cara menulis itu dalam kode adalah:
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
Cara lain untuk melakukan ini tanpa menggunakan gabungan adalah dengan melemparkan a
ke pointer uint16_t dan kemudian dereferensi seperti itu:
uint8_t a[2] = {0x35, 0x4A};
uint16_t b = *((uint16_t *) a);
b == 0x4A35; // because AVR is little endian
Jika Anda menggunakan buffer untuk menyimpan data big endian (mis. Urutan byte jaringan), maka Anda perlu byte-swap untuk menggunakan salah satu dari teknik ini. Cara untuk melakukannya tanpa cabang atau variabel sementara adalah:
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
Kebetulan ini bukan AVR atau bahkan masalah yang hanya tertanam. Kode jaringan level aplikasi yang ditulis untuk PC biasanya memanggil fungsi-fungsi yang disebut htonl
, htons
(host to network, varian 32-dan 16-bit) dan ntohl
, ntohs
(network to host, varian 32-dan 16-bit) yang implementasinya bergantung pada arsitektur target, apakah mereka menukar byte atau tidak (dengan asumsi bahwa byte yang dikirimkan 'on the wire' selalu big-endian ketika mereka adalah bagian dari kata-kata multi-byte).