Я расскажу о различиях на аппаратном уровне, на x86. Это в основном не имеет значения, если вы не пишете компилятор или не используете язык ассемблера. Но это приятно знать.
Во-первых, x86 имеет нативную поддержку для дополнения до двух представления чисел со знаком. Вы можете использовать другие представления, но это потребует дополнительных инструкций и, как правило, будет пустой тратой процессорного времени.
Что я имею в виду под "нативной поддержкой"? По сути, я имею в виду, что есть набор инструкций, которые вы используете для чисел без знака, и другой набор, который вы используете для чисел со знаком. Номера без знака могут находиться в тех же регистрах, что и номера со знаком, и действительно, вы можете смешивать подписанные и неподписанные инструкции, не беспокоя процессор. Компилятор (или программист на ассемблере) должен следить за тем, подписано ли число или нет, и использовать соответствующие инструкции.
Во-первых, два числа дополнения обладают тем свойством, что сложение и вычитание такие же, как и для чисел без знака. Не имеет значения, являются ли числа положительными или отрицательными. (Так что вы просто продолжайте и ADD
и SUB
свои номера без беспокойства.)
Различия начинают проявляться, когда дело доходит до сравнений. В x86 есть простой способ их различения: выше / ниже указывает сравнение без знака и больше / меньше, чем сравнение со знаком. (Например, JAE
означает «Перейти выше или равно» и не имеет знака).
Существует также два набора инструкций умножения и деления для работы со знаковыми и беззнаковыми целыми числами.
Наконец: если вы хотите проверить, скажем, переполнение, вы бы сделали это по-разному для чисел со знаком и для чисел без знака.