Затык с понятием «overflow»

Тема в разделе "WASM.BEGINNERS", создана пользователем aptyp, 13 май 2010.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Not at all! Пользуйтесь на здоровье! Стоит еще отметить, что с INC/DEC флаг OF будет вырабатываться неправильно, так как INC/DEC не влияют на флаг CF
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aptyp
    add не знает знаковые числа или нет, нулевой старший бит об этом ничего не говорит. add одновременно обрабатывает и знаковый и беззнаковый случаи. OF для знаковых и CF для без. Какие числа и какими флагами пользоваться, решать программисту, то есть тебе. ^)
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
     
  4. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Спасибо. Ещё немножко потуплю.))

    Опять же это предполагает что от разрядности переполнение не зависит, якобы процессор абсолютно любое число представляет как знаковое.

    Но опять же повторяюсь, данный пример
    01000000b
    +01000000b
    =10000000b OF=1
    показывает обратное, что переполнение от разрядности зависит, и происходит только при несоответствии знака результата находящегося в старшем разряде регистра, т.е. отличии именно его от знака слагаемых. И не важно был ли перенос из разрядной сетки и был ли вообще знаковый бит в слагаемых.
     
  5. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Вы меня не понимаете, так ведь?))))
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    aptyp
    Уже писал выше: и переполнение (OF), и перенос (CF) от разрядности зависят -- но только в том смысле, переносы из каких разрядов учитывать.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aptyp
    Знаковое число или нет, от битов не зависит, это лишь интерпретация.
    0 - может быть как знаковым так и беззнаковым.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aptyp
    Наоборот.
     
  9. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    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
     
  10. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    В каком смысле учитывать, программисты как и сам процессор оперируют только 8,16,32,64... числами, то бишь относительно таких цифр и работает флаг OF. И как я уже приводил примеры, OF смотрить лишь в старший знаковый бит регистра, проверяет его соответствие знакам слагаемых, при этом ему всё равно, знаковое это число или нет, также всё равно был ли перенос из разрядной сетки, и вообще соответствует ли результат верному. Вот получается так как то?
     
  11. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    aptyp
    Смотрите мой предыдущий пост. Уже несколько раз я писал, что OF = перенос из старшего разряда XOR перенос в старший разряд
     
  12. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Пример с битами можно?
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aptyp
    А чего ты пристал к разрядности? Старший бит у разных типов чисел разный и знаковый бит соответственно с разным номером. Чего тут удивительного?
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
  15. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    l_inc,
    вроде бы это не совсем подходящий пример, ведь и так понятно что там так и так OF=0.
    Booster, ты не понимаешь просто что я имею ввиду.
    Опять же, когда итог сложения однотипных чисел, не важно отрицательных или нет, меняет знак в результате, при этом этот результат является корректным, безо всяких переносов и т.п., зачем поднимается OF? Именно это мне кажется странным. Но всё же, ладно, надо ещё это обдумать. Пример с битами не помешал бы.
     
  16. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    Сам себя процитирую ибо ошибся. Вот так првильнее скажу.
    Опять же, когда итог сложения однотипных чисел, положительных, меняет знак в результате, при этом этот результат является корректным, безо всяких переносов и т.п., зачем поднимается OF? Если бы при сложении отрицательных произошло изменение старшего бита, понятно был OF=1.
     
  17. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    OF устанавливается, когда получен некорректный знаковый результат. Сложили два отрицательных числа и получили положительное -- это переполнение. Сложили два положительных и получили отрицательное -- тоже переполнение.
     
  18. aptyp

    aptyp Member

    Публикаций:
    0
    Регистрация:
    17 сен 2008
    Сообщения:
    81
    SII, верно, так и есть. Но в случае сложения положительных, если результат является правильным, при изменённом знаке, и без переносов, процессору то всё равно знаковое число или нет, зачем он поднимает OF?
    При сложении отрицательных, проверяется ведь знаковый бит SF, и биты слагаемых, при несоответствии поднимается OF, это элементарно.
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    aptyp
    Да потому-что для знаковых чисел произошло переполнение и результат для них абсолютно не корректный. 0x7ffffff. - это положительное число, если прибавить 1, то результат так же должен быть положительным, а он становится отрицательным!. Где ты тут нашёл корректный результат?
     
  20. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    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) ?