Есть целое 16-битное (два байта), как получить значение одного из байтов в нем?
Ответ:
[Вернуться в категорию "Вопросы и ответы по программированию на C для микроконтроллеров PIC."] Используйте следующий код:
unsigned int x; unsigned char y; #define hibyte ( x ) ( unsigned char ) ( x >> 8 ) #define lobyte ( x ) ( unsigned char ) ( x & 0xFF )
Пример:
x = 0x1234; y = hibyte ( x ); // итак y = 0x12 y = lobyte ( x ); // итак y = 0x34
Примечание: если у компилятора включена оптимизация, то операция сдвига вправо на 8 выполнена не будет, а будет возвращено прямо значение байта. Обязательно нужно использовать операцию приведения типа (см. учебники по С). Применение объединений (union) не всегда желательно, потому что передача функции объединения в качестве параметра более трудное. Вышеуказанный метод хорош для просмотра переменных в любых банках. Но для их изменения нужно использовать указатели. Для каждого банка необходимы свои определения:
#define lobyte_atbank0(x) (unsigned char)(*(((unsigned char *)&x)+0)) #define hibyte_atbank0(x) (unsigned char)(*(((unsigned char *)&x)+1)) #define lobyte_atbank1(x) (unsigned char)(*(((bank1 unsigned char *)&x)+0)) #define hibyte_atbank1(x) (unsigned char)(*(((bank1 unsigned char *)&x)+1))
и так далее. [Вопросы и ответы по программированию на C для микроконтроллеров PIC.]
|