[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Работает везде и всегда с минимальными доработками ( порядок байт в слове, неименованные структуры )
typedef union {
int AsInt;
unsigned int AsWord;
unsigned char Bytes[2];
struct {
unsigned char LowByte;
unsigned char HighByte;
}; /* это неименованная структура, если компилятор этого */
/* не позволяет, можно дать имя, откорректировав нижеследующее */
} __word;
#define HIGH_BYTE(x) (((__word)(x)).HighByte)
// или #define HIGH_BYTE(x) (((__word)(x)).Bytes[0])
#define LOW_BYTE(x) (((__word)(x)).LowByte)
#define SWAP_BYTES(x) ((HIGH_BYTE(x)>>8|(LOW_BYTE(x)<<8))
ну и затем например :
HIGH_BYTE(word1)=10;
LOW_BYTE(word2)=HIGH_BYTE(0x1234);
HIGH_BYTE(word4)=LOW_BYTE(SWAP_BYTES(word3));
Скобок много, чтобы не нарваться на неприятности с макросами.
Единственное ограничение - нельзя использовать в левой части выражения запись вида HIGH_BYTE(*ptr) - для этого нужен отдельный макрос с косвенной адресацией.
E-mail: info@telesys.ru