По Питеру Абелю... Отрицательные числа --------------------- Все представленные выше двоичные числа имеют положительные значения, что обозначается нулевым значением самого левого (старшего) разряда. Отрицательные двоичные числа содержат единичный бит в старшем разряде и выражаются двоичным дополнением. Т.е., для представления отрицательного двоичного числа необходимо инвертировать все биты и прибавить 1. Рассмотрим пример: Число 65: 01000001 Инверсия: 10111110 Плюс 1: 10111111 (равно -65) А разве 10111111 не равно -63? Или я не до конца допонял. Подскажите пожалуйста
У меня проблема по отрицательным числам. Как их вообще сравнивать? Подробности: Обрабатываю WM_MOUSEMOVE. Я вызывал SetCapture, поэтому движения мыши будут передаваться окну даже если мышь не над окном. Извлекаю из lParam координаты. Потом вызываю GetClientRect. Мне нужно ловить следующие моменты:так: - когда мышь находится вне окна и справа - когда мышь находится вне окна и слева Если мышь находится слева от окна (вне окна), то координата Х принимает отрицательное значение. Но узнать, меньше он нуля или нет, не получается. Писал примерно так: Код (Text): .if XPos < 0 ; ... .endif но это не действует, так как если дать XPos функции wvsprintf, то он вернет где то около 65535. Я так думаю, что .if работает с числами как с положительными, то есть XPos он воспринимает не как -20, а как, допустим, 65340. Как исправить? Пожалуйста помогите, я на этом на два дня застрял.
rei3er? но ведь если сложить положительное число и отрицательно (обратное +1) будет ноль, т.е. 10111111 должно быть -65, а иначе ноль как получится?
Nikankin 10111111 (-65) + 01000001 (65) = 00000000 В чем вопрос-то? Кстати, дополнение работает не только для двоичных чисел, но и для любой системы счисления. Поэтому, если в двоичной непривычно, можно потренироваться в десятичной.
Ноль получится в результате того что результат сложение этих чисел не влезет в разрядную сетку 0100 0001 + 1011 1111 ------------ 1 0000 0000
Не получается... Он их воспринимает как положительные числа. Он сравнивает 6553* с нулем, а мне нужно чтоб он сравнивал отрицательное число с нулем.
Qasm Кто воспринимает то? Компилятор? signed или не signed XPos определяется лишь тем, при помощи каких команд ты с XPos работаешь.
Nikankin Ну ведь уже показали, как получается отрицательное число: 01000001(65) = ~(01000001) + 1 = 10111110 + 1 = 10111111(-65). И наоборот: 10111111(-65) = ~(10111111) + 1 = 01000000 + 1 = 01000001(65). ~ означает побитовое отрицание.
Пардон ребята, как же я упустил, ведь в двоичных отрицательных величина числа выражается значениями нулевых битов, в отличие от положительных. А я дурень, уже калькулятором воспользовался, сижу единичные биты считаю
Работаю как обычно, mov add sub mul div cmp jl и т.д. XPos извлекаю из lParama. Когда сравнивает число 30 и 0, он (тот, кто выполняет код) думает, что 30 больше чем 0. А если начнет сравнивать 30 и -20, он будет думать, что -20 > 30. Какие операторы сравнения использовать нужно?
Нет, 10111111 - это -65 -63 = 11000001 Как уже написали Т.е. код: Код (Text): test al,al js @signed_negative ; здесь идёт переход если число <0, можно jl написать Код (Text): test al,al jb @signed_negative ; а здесь никогда переход не сработает, jb для беззнаковых чисел, и меньше нуля они быть не могут Т.е. jl/jg (less/greater) - это для чисел со знаком, jb/ja (below/abow) - для беззнаковых. Само число может расцениваться как знаковое, так и беззнаковое - всё зависит от команд при помощи которых ты с ним работаеш: 10111111 = -65 = 191
Показывай свой код Код (Text): mov al,-20 cmp al,30 jl @smaller ; тут переход происходит nop @smaller: nop
Код (Text): ; ---------- извлечение XPos ---------- mov eax,lParam shr eax,16 mov YPos,eax mov eax,lParam and eax,0FFFFh mov XPos,eax ; ---------- Проблемный момент ---------- mov eax,0 cmp XPos,eax jl qwerty1 jmp qwerty2 qwerty1: ; это место выполняется, если XPos < 0 ; далее по смыслу выполняется qwerty2 (тут же, сразу после этого) qwerty2: ; это место выполняется всегда это не работает...
Конечно оно не будет работать, т.к. проблемный момент у тебя выше, чем ты показал. Ты выделяешь из lParam координаты и сохраняешь в переменные, а кто будет делать знаковое расширение word->dword? Почитай описание movsx