Добавление двух целых чисел со знаком или без знака

Прошло много времени с тех пор, как я последний раз программировал на уровне битов и байтов и хотел подтвердить что-то, что я помню из тех дней:

Скажем, у меня есть два целых числа одинаковой длины (1, 2, 4, 8 байт; это не имеет значения), и я складываю их: различается ли побитовый результат суммы, если они подписаны или не подписаны. Другими словами: независимо от того, являются ли они целыми числами со знаком или без знака, останутся ли биты одинаковыми?

Моя интуиция и слабая память говорят мне, что они будут, но я просто хотел подтвердить. Благодарю.

9

Решение

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

РЕДАКТИРОВАТЬ

Как отмечено в комментариях, переполнение в подписанном добавлении является неопределенным поведением, что означает, что ничего нельзя сказать о результатах в таком случае.

13

Другие решения

Я знаю, что на этот вопрос уже дан ответ, но все процессоры, с которыми я когда-либо работал (около десятка различных архитектур — и я имею в виду архитектуры, а не разные варианты), имеют только ОДИН тип инструкции ADD — у нее могут быть разные параметры размера, но это одна инструкция. То же самое относится и к вычитанию. Это отличается от умножения и деления, которое обычно имеет варианты для подписи и без знака — или требует, чтобы вход был «скорректирован на знак» каким-либо образом.

Единственными другими инструкциями, которые делают различие между подписанным и неподписанным, являются условные инструкции, например «ветвь на меньше чем» будет иметь один вариант для «беззнакового меньше чем» и один вариант для «подписанного меньше чем» (один из которых обычно называется чем-то отличным от «меньше чем», например, «ниже» или «переносить набор») или некоторые такие).

4

По вопросам рекламы [email protected]