Я столкнулся с некоторыми странными обозначениями в программе на C++. Я имею дело с битовым сдвигом, и я наткнулся на функции LOWORD () и HIWORD (). Я понимаю, что LOWORD - это значение младших 2 байтов целого числа. Я также знаю, что HIWORD - это два старших байта этого целого числа. Однако я столкнулся с фрагментом кода, который выглядел примерно так:
#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
int v1 = 0x12343460;
int v2 = 0x11111111;
HIWORD(v2) = HIWORD(v1);
LOWORD(v1) = LOWORD(v2);
Судя по тому, что кажется, похоже, что программист предлагает поместить значение одной функции в другую функцию. Однако это кажется невозможным без серьезной программистской магии. Мы будем очень благодарны за любую помощь в расшифровке этого фрагмента кода.
Хорошо, если вы «понимаете», что такое LOWORD и HIWORD, то в чем конкретно заключается ваш вопрос? Здесь никто не знает, что такое LOWORD или HIWORD, поскольку определение этих загадочных функций или макросов не показано в вашем вопросе. Вы знаете о них больше, чем кто-либо другой, читавший этот вопрос. Чтобы ответить на единственный актуальный вопрос здесь, нет, этот код «не имеет никакого смысла», поскольку принцип работы HIWORD и LOWORD не показан, и единственное, что здесь можно сделать, - это предположить, что это за загадочные функции.
Проголосовали за закрытие за отсутствие воспроизводимого примера.
Вам нужно показать определенияHIWORD и LOWORD. Мы не пишем на английском :-)
Я не понимаю, как может работать этот код. Просто попробовал и не получилось
@SeverinPappadeux, есть находятся способов, которыми это могло бы работать (см. Мой ответ для одного из них). Однако, как вырезать собственное сердце тупой ложкой, это не лучшая идея :-)
@paxdiablo Да, я думал, что вы могли бы сделать что-то подобное, но, насколько я (и все остальные) знаю из печально известного семейства заголовков windows.h, это все еще макросы, и код, подобный приведенному выше, не будет работать. Только что проверил с VS 2017 и Windows 10 april SDK, #include "windows.h" и т. д.
HWORD и LOWORD определены в MSDN. см. win32.





Просто попробовал код, который вы предоставили, и он не компилировался
Вот как эти макросы определены
#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
WORD - uint16_t, DWORD_PTR - uint32_t. Компилятор сказал, что левая сторона должна быть lvalue
"DWORD_PTR - это uint32_t" - только при компиляции для 32 бит. Если вы компилируете для 64-битной версии, это uint64_t. Это то, что называется _PTR - это целое число размером с указатель.
Вау, это действительно ужасный код. Что касается способа Только, я мог видеть, что работает (как функции), если функции возвращают ссылки на части переданных переменных. Другими словами, что-то вроде:
#include <iostream>
unsigned short int & HIWORD(unsigned int & x) {
return *(reinterpret_cast<unsigned short int *>(&x) + 1);
}
unsigned short int & LOWORD(unsigned int & x) {
return *(reinterpret_cast<unsigned short int *>(&x) + 0);
}
int main() {
unsigned int v1 = 0x11112222;
unsigned int v2 = 0x33334444;
std::cout << "Before: " << std::hex << v1 << ' ' << v2 << '\n';
HIWORD(v2) = HIWORD(v1);
LOWORD(v1) = LOWORD(v2);
std::cout << "After : " << std::hex << v1 << ' ' << v2 << '\n';
}
Это (по крайней мере, в моей системе) генерирует то, что вы, вероятно, видите:
Before: 11112222 33334444
After : 11114444 11114444
Но, если вы на самом деле кодируете такой видеть, я бы предложил один из двух вариантов действий:
Теперь это возможный, они могут быть макросами, а не функциями, но мой совет по-прежнему остается в силе относительно двух возможных вариантов.
Исправить это:
#define HIDWORD(dw, hw) LOWORD(dw) | (hw << 16)
#define LODWORD(dw, lw) (HIWORD(dw) << 16) | lw
-----------------------------------------------
v2 = HIDWORD(v2, HIWORD(v1));
v1 = LODWORD(v1, LOWORD(v2));
Думаю, это лучшая гипотеза. Когда я посмотрел на вопрос, я сначала подумал: «Вероятно, это какой-то тип свопа». Если я прав, мы чередуем младшие и высокие слова «v1 и v2» вместе в вашем примере?
Поскольку они обычно определены в API Win32, это не может работать (за исключением, возможно,
LOWORD, благодаря нестандартному расширению lvalue cast). Если у вас разные определения, вы должны опубликовать их.