DWORD wParam = 0xB0020005;
int nPos = (short)HIWORD(wParam);
И в результате nPos == 0xFFFFB002
Причем такой результат получается не всегда, в основном всеже 0x0000B002, как и должно быть.
Непонятно откуда берется такое значение?
Кстати было замечено что такой глюк только при значениях больше HIWORD, т.е. приотрицательном shorte.
ЗЫ: Кстати этот код взят из MFC, при движении он генерит сообщение OnHScroll, в который приходят иногда именно эти корявые значения в параметре nPos.
ЗЫЫ: Приложение не многопоточное.
20.11.03 13:36: Перенесено модератором из 'C/C++' — ПК
Здравствуйте, id, Вы писали:
id>Здравствуйте, Denwer, Вы писали:
D>>DWORD wParam = 0xB0020005; D>>int nPos = (short)HIWORD(wParam);
D>>...
id>int nPos = (unsigned short)HIWORD(wParam);
Да это понятно что так мы расширим диапазон значений, но откуда берутся единички в старших разрядах, которые неподвластны этому шорту, т.е. туда шорт просто никак не доберется. И притом не всегда даже при больших значениях.
Здраствуйте, Denwer. Вы писали:
D> Здравствуйте, id, Вы писали: D> id>> Здравствуйте, Denwer, Вы писали: D> D>>> DWORD wParam = 0xB0020005; D>>> int nPos = (short)HIWORD(wParam); D> D>>> ... D> id>> int nPos = (unsigned short)HIWORD(wParam); D> Да это понятно что так мы расширим диапазон значений, но откуда берутся D> единички в старших разрядах, которые неподвластны этому шорту, т.е. туда D> шорт просто никак не доберется. И притом не всегда даже при больших D> значениях.
Знаковый бит размножается
Серьезно
Здравствуйте, Denwer, Вы писали:
D>Здравствуйте, id, Вы писали:
id>>Здравствуйте, Denwer, Вы писали:
D>>>DWORD wParam = 0xB0020005; D>>>int nPos = (short)HIWORD(wParam);
D>>>...
id>>int nPos = (unsigned short)HIWORD(wParam); D>Да это понятно что так мы расширим диапазон значений, но откуда берутся единички в старших разрядах, которые неподвластны этому шорту, т.е. туда шорт просто никак не доберется. И притом не всегда даже при больших значениях.
смотри asm-код:
если операнд операции сдвига (а имеенно такая операция используется макросом HIWORD) знаковое значение, то используется арифметический сдвиг (sar), а не простой сдвиг (вправо) — shr!
id>смотри asm-код: id>если операнд операции сдвига (а имеенно такая операция используется макросом HIWORD) знаковое значение, то используется арифметический сдвиг (sar), а не простой сдвиг (вправо) — shr!
Sorry,
единици в старших разрядах появляются при преобразовании short в int.
Здравствуйте, id, Вы писали:
id>>смотри asm-код: id>>если операнд операции сдвига (а имеенно такая операция используется макросом HIWORD) знаковое значение, то используется арифметический сдвиг (sar), а не простой сдвиг (вправо) — shr!
id>Sorry, id>единици в старших разрядах появляются при преобразовании short в int.
Вот именно, но так же не должно быть то.
Re[6]: Как такое может быть?
От:
Аноним
Дата:
29.10.03 07:50
Оценка:
Здравствуйте, Denwer, Вы писали:
id>>единица в старшем разрядеразмножается при преобразовании short в int.
D>Вот именно, но так же не должно быть то.
Должно. Знак рамножается — значение сохраняется.
Изучай дополнительный код, как способ представления отрицательных чисел.