Вопрос

Мне нужен был макрос Hidword для программы, которую я делаю, и нашел это здесь: http://gnuwin32.sourceforge.net/compile.html

Что я смущен, так это почему есть &0xFFFFFFFF в конце?

#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))

Как это в любом случае изменяет выход этого макроса?

Это было полезно?

Решение

Я не думаю, что это имеет какой -либо реальный эффект - (DWORD) Отправить, что окончательная операция выражения приведет к результату до 32 бит.

А (DWORDLONG) Заталкивает операцию смены действовать по беззнаковому значению, поэтому никакие «биты знаков» не будут перемещены в промежуточный результат. Однако, поскольку операнд может составлять 64 бита, в более высоких местах могут быть ненулевые биты, чем бит 31. & 0xFFFFFFFF Операция будет расти этими битами, но так же (DWORD) В ролях.

Но это тоже не повредит. Можно утверждать, что это проясняет намерение макроса (за исключением вас, может быть, просто шучу!).

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

Это имеет дело с возможными расширение знака явно маскируя биты высокого порядка. На самом деле ваш компилятор делает Расширение знака для правого сдвига отрицательного определения определяется.

РЕДАКТИРОВАТЬ: расширение знака относится к установлению битов высокого порядка, чтобы сохранить знак при сдвиге числа.

Например:

11111110

IS -2, если мы предположим, что это 8 -битный номер дополнения. Если мы сделаем просто логический сдвиг верно, мы получаем:

01111111

Однако это меняет знак числа. Многие компиляторы сделают арифметический сдвиг, чтобы дать:

11111111

Обратите внимание, что мы заполняем наиболее значимый бит (он будет более чем один для более сложного примера) с 1.

Предполагая, что это не подписываемые типы, и предполагают DWORD 32 бита и DWORDLONG 64 бита, тогда технически он ничего не делает.

Возможно, это просто код, оставшийся от копирования и вставки с аналогичным макросом для подписанных типов?

Или, возможно, одно из предположений, которые я отметил, не удерживаются.

Ура и hth.,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top