Подтвердить что ты не робот

Отрицательные числа сохраняются как 2 дополнения в памяти, как ЦП знает, является ли это отрицательным или положительным?

-1 может быть представлен в 4-битном двоичном виде как (2 дополнение) 1111

15 также представляется как 1111.

Итак, как ЦП отличается от 15 до -1, когда он получает значения из памяти?

4b9b3361

Ответ 1

ЦПУ не волнует, сохраняет ли байт -1 или 15, когда он перемещает его из одного места в другое. Нет такой вещи, как "подписанный ход" (к местоположению того же размера - есть подписанный ход для более крупных или небольших пунктов назначения).

Процессор заботится только о представлении, когда он выполняет арифметику по байту. ЦП знает, нужно ли выполнять подписанную или неподписанную арифметику в соответствии с op-кодом, выбранным вами (или компилятором от вашего имени).

Ответ 2

ЦП не знает, подписано ли число или нет. Когда компилятор создает файл машинного языка, он выбирает правильную операцию для выполнения математической операции с этим номером. Если вы указали, что ваша переменная имеет тип подписанного типа, например, операция, выполняемая на машинных языках, будет относиться к этой позиции памяти как знаковое значение.

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

Ответ 3

В большинстве предыдущих ответов упоминаются отдельные коды операций. Это может быть справедливо для более сложных операций, таких как умножение и деление, но для простого сложения и вычитания, что не так, как работает ЦП.

ЦП хранит данные о результате инструкции в регистре флагов. На x86 (где я больше всего знаком) двумя самыми важными флагами являются флаги "переполнения" и "переноса".

В принципе, ЦПУ не заботится о том, подписан ли число или без знака, он относится к ним одинаково. Флаг переноса устанавливается, когда число превышает верхнее значение без знака, которое может содержать. Флаг переполнения устанавливается, когда он переходит или находится под диапазоном беззнакового числа. Если вы работаете с неподписанными номерами, вы проверяете флаг переноса и игнорируете флаг переполнения. Если вы работаете с подписанными номерами, вы проверяете флаг переполнения и игнорируете флаг переноса.

Вот несколько примеров:

Unsigned:

1111 (15) + 1111 (15) = 1110 (14)

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

1 1110 (30)

Подпись:

1111 (-1) + 1111 (-1) = 1110 (-2)

В этом случае вы игнорируете флаг переноса, флаг переполнения должен быть установлен на ноль.

Unsigned:

0111 (7) + 0111 (7) = 1110 (14)

Когда вы проверяете флаг переноса, он должен быть равен нулю.

Подпись:

0111 (7) + 0111 (7) = 1110 (-2)

В этом случае флаг переполнения будет установлен, что означает, что в добавлении произошла ошибка.

Таким образом, число, которое только подписано или неподписанно, основано на вашей интерпретации, CPU дает вам инструменты, которые необходимо различать между собой, но не различает сам по себе.

Ответ 4

На уровне компилятора дифференцирование основано на типе данных. Если тип данных является int, то для этой переменной (в C) выделяется 4 байта. Итак, 15 из 2 дополнений 00000000 00000000 00000000 00000000 00001111, а -1 - 11111111 11111111 11111111 11111111. Затем компилятор преобразует его в соответствующий код операции ЦП. CPU выполняет этот код операции, и на этом уровне все находится в форме 1s и 0s.

Ответ 5

Самый маленький доступный блок - 1 байт. Это 8 бит. В 8-битовом представлении 15 сохраняется как 00001111. Компилятор отличает положительное и отрицательное число от бита знака. MSB - знаковый бит. Если это 0, значит, положительное число. Если это 1, это означает отрицательное число. MSB двоичного представления 15 равно 0. Это означает положительное число, а 00001111 соответствует +15. 8-битный двоичный код -1 равен 11111111, поскольку его MSB равен 1, а отрицательное число принято. Сначала компилятор принимает свой 2-й набор, а затем отображает число с отрицательным знаком. Помните, что для хранения номера должно быть 8 бит, тогда максимальное значение, которое вы можете сохранить в нем, равно (2 ^ 7) -1, который принимает 7 бит в своем представлении. Это означает, что MSB всегда равен нулю для положительного числа. Как и в вашем вопросе, если мы предположим взять 4 бита для хранения числа, тогда доступны 3 бита для хранения значения, поскольку последний бит является резервом для хранения знака. Для 3 бит максимальное значение, которое может быть сохранено, равно (2 ^ 3) -1 = 7. Это означает, что 15 не могут быть сохранены в 4 битах. Поэтому 1111 всегда принимается как -1 компилятором.

Следуйте приведенной ниже ссылке, чтобы получить доступ к каналу YouTube с такими сложными вопросами. www.YouTube. ком/смотреть? v = ZxRHOT3pzx4

Ответ 6

В 2 дополнениях для представления 15 мы требуем 5 бит, диапазон для 2'complemnt равен От -16 до 15, поэтому значение становится 01111, здесь бит MSB равен 0, поэтому его положительное значение для -1 станет 11111