Какие арифметические операции одинаковы для чисел без знака и двух дополнений?

Я разрабатываю простой комплект игрушек и сопровождающий эмулятор, и я пытаюсь выяснить, какие инструкции следует поддерживать. На пути арифметики у меня в настоящее время есть unsigned add, subtract, multiply и divide. Тем не менее, я не могу найти окончательного ответа на следующий вопрос: кому из арифметических операторов нужны подписанные версии и для которых эквивалентны подписанные версии без знака и двух?

Так, например, 1111 в дополнении 2 равно -1. Если вы добавите 1 к нему и притворитесь, что это число без знака, вы получите 0000, что правильно, даже если вы думаете об этом как -1. Однако это верно для всех чисел? А как насчет других трех операций (вычитание, умножение, деление)?

Благодаря!

    Добавление и вычитание одинаковы для дополнений с подписью и без знака 2, предполагая, что вы будете обрабатывать переполнение / недополнение в обычном режиме для большинства процессоров, т. Е. Просто обернуть. Умножение и деление разные. Таким образом, вам нужна только одна процедура сложения и одна процедура вычитания независимо от подписанности, но вам нужно разделить раздельное и беззнаковое умножение и разделить.

    Сложение, вычитание и умножение одинаковы:

    1. Ваши входы и выходы имеют одинаковый размер
    2. Ваше поведение при переполнении ограничено по модулю 2 n

    Отдел отличается.

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

    Кроме того, если вы пишете свой эмулятор в C, есть некоторые недостатки языка, о которых вам нужно знать.

    1. Переполнение подписанной арифметики в C является неопределенным поведением. Для получения достоверной по модулю 2 n арифметики поведения должны выполняться с использованием неподписанных типов.
    2. C будет продвигать типы, меньшие, чем int int. Чтобы избежать таких рекламных акций, необходимо проявлять большую осторожность (добавление 0u или умножение на 1u в начале вашего расчета – один из способов).
    3. Преобразование из неподписанных типов в подписанные типы определяется реализацией, реализации, которые я видел, делают разумную вещь, но могут быть некоторые, которые этого не делают.

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

    Давайте будем гением компьютера.