нести флаг и вопрос вычитания - PullRequest
2 голосов
/ 17 мая 2010

Если большое число вычитается из меньшего числа, то требуется заимствование. Флаг переноса играет роль заимствования во время операции вычитания. Теперь предположим, что мы хотим вычесть 66 из 56, очевидно, что заимствование необходимо, и будет установлен флаг переноса. Теперь, как выполняется это вычитание, чтобы получить результат -10, как компьютер будет различать, что результат будет отрицательным числом. Пожалуйста, объясните процесс.

Ответы [ 5 ]

4 голосов
/ 17 мая 2010

Обычно вычитание выполняется как отрицание, затем добавляется. Так что для вашего примера, центральный процессор будет принимать 56 и добавить -66. На x86 (или большинстве других современных процессоров) отрицание будет выполнено с дополнением до двух, что означает перевод отрицания на «дополнить все биты, затем добавить один (и игнорировать любое выполнение)».

    0011 1000
-   0100 0010
    ---------

Второй операнд преобразуется следующим образом:

complement bits: 1011 1101
Increment:       1011 1110

Итак, операция, которая выполняется:

    0011 1000
+   1011 1110
--------------
=   1111 0110

Этот результат можно рассматривать как 246 (как число без знака) или -10 (как число со знаком).

3 голосов
/ 17 мая 2010

Компьютер не нужен, если он использует дополнение 2.

Давайте рассмотрим более простой пример, 3 - 5:

    0011 = 3
-   0101 = 5
————————
    1110 = 14

Результат - 14, но в дополнении к 2 это также значение -2. Таким образом, если код использует подписанный тип, он будет правильно получать -2. В противном случае он получит 14. Все зависит от того, как программист напишет код.

1 голос
/ 17 мая 2010

Компьютер не вычитает. Это делает сложение отрицательного числа.

Итак, 56 - 66 = 56 + (-66)

56 = 0x38 (38 в шестнадцатеричном)

-66 = 0xFFFFFFBE (дополнение 0x42 в 32-битной системе)

Если вы добавите эти шестнадцатеричные числа, вы получите 0xFFFFFFF6, который является отрицательным дополнением к 0xA, что является десятичным числом 10.

0 голосов
/ 17 мая 2010

Флаг переноса не совпадает со знаковым битом. Флаг переноса используется для выполнения многочастной арифметики, когда результат одного сложения или вычитания должен влиять на следующую более высокую часть.

С увеличением размеров регистров с годами и уменьшением ассемблера, вы больше не видите, как это делается.

0 голосов
/ 17 мая 2010

Компьютер этого не различит. Компьютер не заботится о знаках, как вы и компилятор. Вы сохраните это значение в знаковой переменной, а затем будете использовать ее как подписанную. Не существует семантической разницы между длинными числами и отрицательными числами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...