При попытке прочитать данные из памяти в перечисление с помощью следующего кода я получил странные результаты:
void read_memory (const unsigned, const unsigned, unsigned* const);
/* ... */
enum {DATA_0, DATA_1, DATA_2} data;
read_memory(base_addr, offset, &data); //data = 0x0900
data >>= 8; //data = 0x7e000000
Я обошел эту проблему, введя временную переменную беззнакового типа.Но я бы хотел убедиться, что понимаю, почему предыдущий метод не работает.
Прежде всего, я знаю, что стандарт не требует определенной ширины для перечисляемых типов, пока все членымогут быть представлены.Фактически, 6.7.2.2 утверждает, что:
Каждый перечисляемый тип должен быть совместим с типом char, целочисленным типом со знаком или целочисленным типом без знака.
Но поскольку необработанные данные, считанные из памяти, помещаются в символ, я думаю, что это не должно быть проблемой.Более того, если я правильно понимаю, «совместимый» означает, что вы можете использовать его, как если бы он был такого типа.В частности, объекты перечислимого типа могут быть операндами побитовых операторов сдвига.Я также знаю, что подпись может быть проблемой, поскольку мы не знаем, подписаны ли enum или нет.Но, насколько я могу судить, 0x0900, похоже, не подписан.
Так в чем же проблема?