Вы, кажется, путаете флаги переноса и переполнения.
Флаг переноса проверяет неподписанное переполнение, а флаг переполнения проверяет переполнение подписей.
Как это работает, так это то, что перед вычитанием сравниваются (без знака) числа и если b> a, тогда устанавливается CF.
Если знак первого операнда изменяет значение переполнения.
Во время вычитания ЦПУ не заботится о том, являются ли операнды отрицательными.
Если база без знака меньше вычитаемого без знака числа, то происходит перенос.
E.g. (Только испытания с точки зрения процессора моего отладчика)
0 - -1 = 1 ->> CF = 1, because 0xFFFFFFFF > 0
10 - -1 = 11 ->> CF = 1, same reason
-2 - 4 = -6 ->> CF = 0, because 0x4 < 0xFFFFFFFE
Помните, в знаковой арифметики эти результаты являются правильными, но без знака арифметике они * способ * выключен, поэтому CF = 1.
Флаг переноса не знает или не заботится о знаке, он (только) предназначен для неподписанного переполнения. Помните, что у CPU нет возможности узнать, хотите ли вы выполнять подписанные или неподписанные операции. Именно приложение может тестировать соответствующие флаги для интерпретации результатов, поэтому CPU предоставляет два набора флагов переполнения.
Вот список наиболее распространенных флагов и их функции:
code | descripton |name | When set
---+++----------------+---------+-------------------
CF unsigned overflow Carry If unsigned over-/underflow occurs
OF signed overflow Overflow If sign bit (MSB) flips
SF Sign flag Sign If MSB is set, i.e. is result is negative
ZF Zero flag Zero If Result is zero
Ни один из этих флагов имеют много на пути «интеллекта».
Необходимо помнить, что эти флаги были спроектированы, когда транзисторы были в дефиците.
О 2 дополнением
2 дополнением разработан таким образом, что сложение и вычитание не нужно знать о конверсии с положительного на отрицательный.
Вы можете просто добавить и вычесть без осторожности, если операнд или результат будут положительными или отрицательными.
Единственные предостережения возникают при переполнении, что является тем, что проверяет флаг переноса.
Если вы используете инверсию (например, дополнение 1) как отрицательные числа, тогда вам понадобятся всевозможные меры предосторожности при добавлении и вычитании; вот почему 2-й вариант универсально используется.
Дальнейшее чтение
http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt
Спасибо Peter
Вы чрезмерно усложнять ее. Процессор не знает о дополнении 2. ALU вычитает операнды, и полученный перенос переходит в этот флаг 'C'. Он также установит флаг 'O' от выполнения к m.s. немного. И флаг 'S', чтобы отразить m.s. немного. И флаг 'Z', если результат был' 0'. Другие флаги тоже зависят от процессора. * Как это делается? Это не «язык». –
Перенос от преобразования отбрасывается, выходной перенос - это отрицание переноса из добавления. Некоторые архитектуры фактически не отрицают его, поэтому вы фактически получаете CF = 1, когда нет заимствований. – Jester
вычитание делается в unsigned, поэтому не нужно знать о типе. Флаг переноса проверяется выходными битами –