Как работает 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 шт):
Макросы ничего не знают о типах. Поэтому они вынуждены учитывать самые разные возможные варианты. Чтобы понять, что да как - давайте сравним ваш макрос и стандартный:
#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 явно недостаточно...