Операции LOWORD и HIWORD - PullRequest
       13

Операции LOWORD и HIWORD

0 голосов
/ 21 сентября 2018

Я столкнулся с какой-то странной нотацией в программе на C ++.Я имею дело со сдвигом битов и натолкнулся на функции LOWORD () и HIWORD ().Я понимаю, что LOWORD - это значение младших 2 байтов целого числа.Я также знаю, что HIWORD - это старшие 2 байта этого целого числа.Тем не менее, я столкнулся с фрагментом кода, который выглядел примерно так:

#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);

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

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

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

#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. Уходи.Просто оставить.Не собирай свои вещи.Просто встаньте со стула, выйдите из двери, садитесь в машину, уезжайте и никогда не возвращайтесь: -)

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

0 голосов
/ 21 сентября 2018

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

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

#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

...