Как работает MAKEWORD?

В заголовочном файле minwindef.h есть такой макрос:

 #define MAKEWORD(a, b)      ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8))

понятно что он делает: собирает из двух байт - два байта.

У меня такой вопрос: зачем так много действий? зачем в первой части сначала производится каст к DWORD_PTR а потом производится побитовое И, во второй части аналогично: нужен же только каст к WORD и сдвиг.

Если я вместо такого макроса буду писать так:

 BYTE a = 0x60;
 BYTE b = 0x20;
 WORD word = ((WORD)a | ((WORD)b) << 8);

будет ли это корректно?


Ответы (1 шт):

Автор решения: Harry

Макросы ничего не знают о типах. Поэтому они вынуждены учитывать самые разные возможные варианты. Чтобы понять, что да как - давайте сравним ваш макрос и стандартный:

#define  MADEWORD(a,b) ((WORD)(a) | ((WORD)(b)) << 8)

#define  MAKE(a,b) \
    cout << hex << MAKEWORD((a),(b)) << "  " << hex << MADEWORD((a),(b)) << endl

и попробуем вызывать разные варианты...

int a, b;
MAKE(3,5);
MAKE(-3,5);
cout << hex << &a << "  " << &b << endl;
MAKE(&a,&b);

это у меня привело к выводу

503                            503
5fd                           fffd
000000443DCFFB98  000000443DCFFB90
9098                        fbfb98

Как видите, просто приведения к WORD явно недостаточно...

→ Ссылка