Я читаю вопрос как Можно ли взять любой массив из 2 символов и интерпретировать его значение как unsigned short
без копирования, используя этот умный union
трюк , и ответ нет, вы не можете .
Причина не в том, что строгое наложение имен, но в том, что оно может нарушать требования выравнивания. Почти все платформы имеют требование выравнивания не менее 2 для unsigned short
. Поведение равно undefined , если указатель преобразуется в другой, не имеющий фундаментального требования выравнивания.
Да, это может аварийно завершить работу на x86 . Забудьте о возможности доступа к невыровненным объектам с помощью машинного языка - вы программируете на C , а не на ассемблере.
правильный способ сделать это - использовать memcpy
, который будет сообщать компилятору, что доступ может быть не выровнен, т.е.
char array[2] = {1, 1};
uint16_t raw_word;
memcpy(&raw_word, array, 2);
Обратите внимание, что memcpy
является стандартной библиотечной функцией, и компилятору разрешено генерировать машинный код любого типа , если он ведет себя , как если бы была вызвана функция memcpy
из стандартной библиотеки.