Я читаю книгу: CS-APPe2. C имеет неподписанный и подписанный тип int, и в большинстве архитектур использует двоичную арифметику для реализации знакового значения; но, изучив некоторый код сборки, я обнаружил, что очень мало инструкций различают неподписанные и подписанные. Поэтому мой вопрос:
-
Обязан ли компилятор дифференцировать подписанные и без знака? Если да, то как это делается?
-
Кто реализует арифметику с двумя дополнениями - процессор или компилятор?
Добавьте дополнительную информацию:
Изучив еще несколько инструкций, на самом деле есть некоторые из них, которые различают подписанные и unsigned, такие как setg, seta и т.д. Кроме того, CF и OF применяются к неподписанным и, соответственно. Но большинство целочисленных арифметических команд обрабатывают unsigned и подписывают то же самое, например.
int s = a + b
и
unsigned s = a + b
генерирует ту же инструкцию.
Итак, при выполнении ADD s d
, если процессор обрабатывает s & d без знака или подписан? Или это не имеет значения, потому что бит-шаблон обоих результатов одинаковый, и задача компилятора преобразует результат базового битового шаблона в беззнаковый или подписанный?
P.S Я использую x86 и gcc