Что делает «& 0xffffffff» в этом макросе HidWord
Вопрос
Мне нужен был макрос 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.,