a
указатель на массив байтов Если вы приведете его к uint16_t и назначите его b
, тогда он b
будет содержать адрес базы массива (где он хранится) в SRAM. Если вы хотите рассматривать два байта массива a
как целое число, используйте объединение, как предложено пользователем 14284, но имейте в виду, что объединение будет представлять байтовый массив в порядке байтов памяти в архитектуре (в AVR это будет мало -endian, что означает, что байт 0 является наименее значимым байтом). Способ написать это в коде:
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
Другой способ сделать это без использования объединения - привести a
к указателю uint16_t, а затем разыменовать его следующим образом:
uint8_t a[2] = {0x35, 0x4A};
uint16_t b = *((uint16_t *) a);
b == 0x4A35; // because AVR is little endian
Если вы используете буфер для хранения данных с прямым порядком байтов (например, порядок байтов в сети), то вам нужно будет поменять местами, чтобы использовать любой из этих методов. Способ сделать это без каких-либо ветвей или временных переменных:
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
Между прочим, это не AVR или даже встроенная проблема. Прикладной уровень сетевого код написан для ПК , как правило , вызовов функций , называемых htonl
, htons
(хоста к сети, 32- и 16-разрядные варианты) и ntohl
, ntohs
(сеть к хосту, 32- и 16-разрядные варианты) , чьи реализации целевые зависят от архитектуры , как ли они поменять местами байты или нет (при условии, что байты, передаваемые «по проводам», всегда имеют порядковый номер, если они являются частью многобайтовых слов).