Как такое может быть?
От: Denwer Россия  
Дата: 29.10.03 07:03
Оценка:
DWORD wParam = 0xB0020005;
int nPos = (short)HIWORD(wParam);

И в результате nPos == 0xFFFFB002
Причем такой результат получается не всегда, в основном всеже 0x0000B002, как и должно быть.
Непонятно откуда берется такое значение?
Кстати было замечено что такой глюк только при значениях больше HIWORD, т.е. приотрицательном shorte.

ЗЫ: Кстати этот код взят из MFC, при движении он генерит сообщение OnHScroll, в который приходят иногда именно эти корявые значения в параметре nPos.
ЗЫЫ: Приложение не многопоточное.

20.11.03 13:36: Перенесено модератором из 'C/C++' — ПК
Re: Как такое может быть?
От: id  
Дата: 29.10.03 07:08
Оценка:
Здравствуйте, Denwer, Вы писали:

D>DWORD wParam = 0xB0020005;

D>int nPos = (short)HIWORD(wParam);

D>...


int nPos = (unsigned short)HIWORD(wParam);
Re[2]: Как такое может быть?
От: Denwer Россия  
Дата: 29.10.03 07:10
Оценка:
Здравствуйте, id, Вы писали:

id>Здравствуйте, Denwer, Вы писали:


D>>DWORD wParam = 0xB0020005;

D>>int nPos = (short)HIWORD(wParam);

D>>...


id>int nPos = (unsigned short)HIWORD(wParam);

Да это понятно что так мы расширим диапазон значений, но откуда берутся единички в старших разрядах, которые неподвластны этому шорту, т.е. туда шорт просто никак не доберется. И притом не всегда даже при больших значениях.
Re[3]: Как такое может быть?
От: PM  
Дата: 29.10.03 07:14
Оценка:
Здраствуйте, 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> значениях.
Знаковый бит размножается
Серьезно
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[3]: Как такое может быть?
От: id  
Дата: 29.10.03 07:17
Оценка:
Здравствуйте, 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!
Re[4]: Как такое может быть?
От: id  
Дата: 29.10.03 07:23
Оценка:
id>смотри asm-код:
id>если операнд операции сдвига (а имеенно такая операция используется макросом HIWORD) знаковое значение, то используется арифметический сдвиг (sar), а не простой сдвиг (вправо) — shr!

Sorry,
единици в старших разрядах появляются при преобразовании short в int.
Re[5]: Как такое может быть?
От: Denwer Россия  
Дата: 29.10.03 07:34
Оценка:
Здравствуйте, id, Вы писали:

id>>смотри asm-код:

id>>если операнд операции сдвига (а имеенно такая операция используется макросом HIWORD) знаковое значение, то используется арифметический сдвиг (sar), а не простой сдвиг (вправо) — shr!

id>Sorry,

id>единици в старших разрядах появляются при преобразовании short в int.

Вот именно, но так же не должно быть то.
Re[6]: Как такое может быть?
От: Аноним  
Дата: 29.10.03 07:50
Оценка:
Здравствуйте, Denwer, Вы писали:

id>>единица в старшем разряде размножается при преобразовании short в int.


D>Вот именно, но так же не должно быть то.


Должно. Знак рамножается — значение сохраняется.

Изучай дополнительный код, как способ представления отрицательных чисел.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.