Not at all! Пользуйтесь на здоровье! Стоит еще отметить, что с INC/DEC флаг OF будет вырабатываться неправильно, так как INC/DEC не влияют на флаг CF
aptyp add не знает знаковые числа или нет, нулевой старший бит об этом ничего не говорит. add одновременно обрабатывает и знаковый и беззнаковый случаи. OF для знаковых и CF для без. Какие числа и какими флагами пользоваться, решать программисту, то есть тебе. ^)
Спасибо. Ещё немножко потуплю.)) Опять же это предполагает что от разрядности переполнение не зависит, якобы процессор абсолютно любое число представляет как знаковое. Но опять же повторяюсь, данный пример 01000000b +01000000b =10000000b OF=1 показывает обратное, что переполнение от разрядности зависит, и происходит только при несоответствии знака результата находящегося в старшем разряде регистра, т.е. отличии именно его от знака слагаемых. И не важно был ли перенос из разрядной сетки и был ли вообще знаковый бит в слагаемых.
aptyp Уже писал выше: и переполнение (OF), и перенос (CF) от разрядности зависят -- но только в том смысле, переносы из каких разрядов учитывать.
aptyp Знаковое число или нет, от битов не зависит, это лишь интерпретация. 0 - может быть как знаковым так и беззнаковым.
aptyp Байтовое сложение: 80h + 80h = 00h, устанавливаются OF и CF. Словное сложение: 0080h + 0080h = 0100h, сбрасываются OF и CF. В первом случае CF = перенос из 7-го разряда = 1, OF = перенос из 7-го разряда XOR перенос в 7-й разряд = 1 XOR 0 = 1 Во втором случае CF = перенос из 15 разряда = 0, OF = перенос из 15-го разряда XOR перенос в 15-й разряд = 0 XOR 0 = 0
В каком смысле учитывать, программисты как и сам процессор оперируют только 8,16,32,64... числами, то бишь относительно таких цифр и работает флаг OF. И как я уже приводил примеры, OF смотрить лишь в старший знаковый бит регистра, проверяет его соответствие знакам слагаемых, при этом ему всё равно, знаковое это число или нет, также всё равно был ли перенос из разрядной сетки, и вообще соответствует ли результат верному. Вот получается так как то?
aptyp Смотрите мой предыдущий пост. Уже несколько раз я писал, что OF = перенос из старшего разряда XOR перенос в старший разряд
aptyp А чего ты пристал к разрядности? Старший бит у разных типов чисел разный и знаковый бит соответственно с разным номером. Чего тут удивительного?
l_inc, вроде бы это не совсем подходящий пример, ведь и так понятно что там так и так OF=0. Booster, ты не понимаешь просто что я имею ввиду. Опять же, когда итог сложения однотипных чисел, не важно отрицательных или нет, меняет знак в результате, при этом этот результат является корректным, безо всяких переносов и т.п., зачем поднимается OF? Именно это мне кажется странным. Но всё же, ладно, надо ещё это обдумать. Пример с битами не помешал бы.
Сам себя процитирую ибо ошибся. Вот так првильнее скажу. Опять же, когда итог сложения однотипных чисел, положительных, меняет знак в результате, при этом этот результат является корректным, безо всяких переносов и т.п., зачем поднимается OF? Если бы при сложении отрицательных произошло изменение старшего бита, понятно был OF=1.
OF устанавливается, когда получен некорректный знаковый результат. Сложили два отрицательных числа и получили положительное -- это переполнение. Сложили два положительных и получили отрицательное -- тоже переполнение.
SII, верно, так и есть. Но в случае сложения положительных, если результат является правильным, при изменённом знаке, и без переносов, процессору то всё равно знаковое число или нет, зачем он поднимает OF? При сложении отрицательных, проверяется ведь знаковый бит SF, и биты слагаемых, при несоответствии поднимается OF, это элементарно.
aptyp Да потому-что для знаковых чисел произошло переполнение и результат для них абсолютно не корректный. 0x7ffffff. - это положительное число, если прибавить 1, то результат так же должен быть положительным, а он становится отрицательным!. Где ты тут нашёл корректный результат?
aptyp Ты, что - издеваешься ?! Тебе 100 раз повторили, что у процессора только один набор команд add\sub\cmp и т.п. независимо от того знаковые операнды, или беззнаковые. Например, add eax,edx - какое сложение знаковое или нет ? Неизвестно, поэтому процессор устанавливает два флага переполнения - CF для беззнаковых и OF для знаковых, а программист уже дальше использует тот или иной флаг при всяких там jcc\setcc и т.п. в зависимости от того с какими числами он работает - зноковыми или без. Например, при сравнении знаковых чисел юзаются переходы по jg\jl и т.п., которые проверяют флаги SF и OF, а для беззнаковых соотв-но ja\jb и т.п., проверяющие флаг CF (см.описание jcc в интеловском мане). И какая тебе разница как там на битовом уровне устанавливается OF ? Разве не достаточно общего определения - OF устанавливается в случае, когда результат операции выходит за пределы макс.(положительного) или мин. (отрицательного) значения знакового числа для заданного числа разрядов (8, 16, 32) ?