Математически вы не добавляете число со знаком или без знака.Есть только значения по модулю 2 32 (при условии, что у вас есть 32-битные регистры).Такие значения охватывают диапазон 2 32 последовательных целых чисел, но вы можете интерпретировать этот диапазон как начинающийся где угодно.«Signed» и «unsigned» - это всего лишь две такие интерпретации.
Другими словами, в 4-битных регистрах интерпретация без знака «1011» равна одиннадцати, в то время как интерпретация со знаком - минус пять.Но есть только одно значение (которое математики обычно называют «одиннадцать по модулю 2 4 », потому что математики традиционно любят неподписанную интерпретацию).Например, если вы добавите «0110» к этому значению (которое равно «шести» в интерпретации со знаком и без знака), то вы получите «0001», что является правильным значением: минус пять плюс шесть дают один, а одиннадцать плюсшесть - это семнадцать, что также равно единице при уменьшении по модулю 2 4 (семнадцать означает один плюс шестнадцать; "уменьшение по модулю 2 4 " означает деление на шестнадцать [это 2 4 ] и сохраняя только остаток).
Другой способ сказать следующее: количество (двоичных) цифр для числового значения концептуально бесконечно слева.Регистр ЦП хранит только 32 самых правых бита.Интерпретация без знака заключается в предположении, что все самые левые биты равны нулю.Интерпретация со знаком подразумевает, что обычно все самые левые биты имеют одинаковое значение, чем бит 31 (т.е. все равны нулю или все равны единице).В любом случае, когда вы выполняете сложение (или вычитание или умножение), переносы распространяются справа налево, а не наоборот, поэтому значения этих игнорируемых битов не имеют никакого отношения к 32-битному результату.Таким образом, существует только один опкод «add», который не заботится о том, являются ли его операнды в мозгу программиста «подписанными» или «беззнаковыми».
Подпись должна приниматься во вниманиепри выполнении операции, которая не совместима с арифметикой по модулю.Преобразование в последовательность десятичных цифр для отображения является такой операцией.Однако более частым случаем являются сравнения.Значения по модулю 2 32 не упорядочены;они находятся в некотором циклическом цикле (когда вы добавляете 1 к 2 32 -1 и уменьшаете по модулю 2 32 , вы возвращаетесь к 0).Сравнения имеют смысл только тогда, когда вы рассматриваете целых чисел во всем диапазоне целых чисел.На этом этапе вы должны решить, используете ли вы подписанную или неподписанную интерпретацию.Вот почему процессоры x86 предлагают и jg
(переход, если больше, интерпретация со знаком) и ja
(переход, если выше, интерпретация без знака).