LOWORD и HIWORD операции

Я столкнулся с некоторыми странными обозначениями в программе на 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);

Судя по тому, что кажется, похоже, что программист предлагает поместить значение одной функции в другую функцию. Однако это кажется невозможным без серьезной программистской магии. Мы будем очень благодарны за любую помощь в расшифровке этого фрагмента кода.

Поскольку они обычно определены в API Win32, это не может работать (за исключением, возможно, LOWORD, благодаря нестандартному расширению lvalue cast). Если у вас разные определения, вы должны опубликовать их.

Matteo Italia 21.09.2018 02:36

Хорошо, если вы «понимаете», что такое LOWORD и HIWORD, то в чем конкретно заключается ваш вопрос? Здесь никто не знает, что такое LOWORD или HIWORD, поскольку определение этих загадочных функций или макросов не показано в вашем вопросе. Вы знаете о них больше, чем кто-либо другой, читавший этот вопрос. Чтобы ответить на единственный актуальный вопрос здесь, нет, этот код «не имеет никакого смысла», поскольку принцип работы HIWORD и LOWORD не показан, и единственное, что здесь можно сделать, - это предположить, что это за загадочные функции.

Sam Varshavchik 21.09.2018 02:36

Проголосовали за закрытие за отсутствие воспроизводимого примера.

Cheers and hth. - Alf 21.09.2018 02:40

Вам нужно показать определенияHIWORD и LOWORD. Мы не пишем на английском :-)

paxdiablo 21.09.2018 03:02

Я не понимаю, как может работать этот код. Просто попробовал и не получилось

Severin Pappadeux 21.09.2018 03:06

@SeverinPappadeux, есть находятся способов, которыми это могло бы работать (см. Мой ответ для одного из них). Однако, как вырезать собственное сердце тупой ложкой, это не лучшая идея :-)

paxdiablo 21.09.2018 03:33

@paxdiablo Да, я думал, что вы могли бы сделать что-то подобное, но, насколько я (и все остальные) знаю из печально известного семейства заголовков windows.h, это все еще макросы, и код, подобный приведенному выше, не будет работать. Только что проверил с VS 2017 и Windows 10 april SDK, #include "windows.h" и т. д.

Severin Pappadeux 21.09.2018 15:57

HWORD и LOWORD определены в MSDN. см. win32.

T.S 30.09.2019 09:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
8
4 441
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Просто попробовал код, который вы предоставили, и он не компилировался

Вот как эти макросы определены

#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 - это целое число размером с указатель.

Remy Lebeau 21.09.2018 06:34

Вау, это действительно ужасный код. Что касается способа Только, я мог видеть, что работает (как функции), если функции возвращают ссылки на части переданных переменных. Другими словами, что-то вроде:

#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

Но, если вы на самом деле кодируете такой видеть, я бы предложил один из двух вариантов действий:

  1. Почини это. Есть около сотни лучших способов сделать то же самое.
  2. Оставлять. Просто оставить. Не собирайте свои вещи. Просто встаньте со стула, выйдите за дверь, сядьте в машину, уезжайте и больше никогда не возвращайтесь :-)

Теперь это возможный, они могут быть макросами, а не функциями, но мой совет по-прежнему остается в силе относительно двух возможных вариантов.

Ответ принят как подходящий

Исправить это:

#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» вместе в вашем примере?

twitchdotcom slash KANJICODER 07.11.2020 03:59

Другие вопросы по теме