a
là một con trỏ tới một mảng byte. Nếu bạn truyền nó tới uint16_t và gán nó cho b
, thì nó b
sẽ chứa địa chỉ của cơ sở của mảng (nơi nó được lưu trữ) trong SRAM. Nếu bạn muốn coi hai byte của mảng a
là một số nguyên, thì hãy sử dụng liên kết theo đề xuất của user14284, nhưng lưu ý rằng liên kết sẽ biểu diễn mảng byte theo thứ tự byte bộ nhớ của kiến trúc (trong AVR sẽ nhỏ -endian, có nghĩa là byte 0 là byte có ý nghĩa nhỏ nhất). Cách để viết mã đó là:
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
Một cách khác để làm điều này mà không cần sử dụng liên kết là chuyển a
sang một con trỏ uint16_t và sau đó hủy đăng ký như vậy:
uint8_t a[2] = {0x35, 0x4A};
uint16_t b = *((uint16_t *) a);
b == 0x4A35; // because AVR is little endian
Nếu bạn đang sử dụng bộ đệm để lưu trữ dữ liệu cuối lớn (ví dụ thứ tự byte mạng), thì bạn sẽ cần trao đổi byte để sử dụng một trong hai kỹ thuật này. Một cách để làm điều đó mà không có bất kỳ nhánh hoặc biến tạm thời nào là:
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
Ngẫu nhiên đây không phải là một vấn đề về AVR hay thậm chí là nhúng. Mức độ ứng dụng mạng mã được viết cho máy tính thường các cuộc gọi chức năng gọi htonl
, htons
(host vào mạng, 32 và 16-bit biến thể) và ntohl
, ntohs
(mạng đến máy chủ, 32 và 16-bit biến thể) mà hiện thực là mục tiêu kiến trúc phụ thuộc là liệu họ hoán đổi các byte hoặc không (theo giả định rằng các byte được truyền 'trên dây' luôn luôn là kết thúc lớn khi chúng là một phần của các từ nhiều byte).