Да, по крайней мере, под общим определением.«Не может быть отрицательным» не означает, что вычитание становится частичной функцией, т.е. «иногда невозможно».Это означает, что есть некоторый результат, и по определению он неотрицательный, интерпретируя старший бит как имеющий положительный вес, а не отрицательный, поэтому просто не существует комбинации битов, которая интерпретируется как"отрицательное значение".
Это действительно только биты.Целые числа со знаком и без знака представляют собой немного разные интерпретации значения битов (например, для 8 битов старший бит имеет вес -128 или +128 в зависимости от того, интерпретируем ли мы его как знак или без знака), в результате чего получается некоторые операции имеют отдельные подписанные и неподписанные версии (очевидно, больше и меньше, также разделение и некоторые другие).Вычитание отсутствует в этом списке аномалий: вычитание - это вычитание, здесь нет «вычитания со знаком» и «вычитания без знака».
Есть несколько способов определить вычитание, не требуя слишком большого количества других определений, например:
x - y = ~(~x + y)
x - y = x + ~y + 1
(это, конечно, эквивалент определений, в противном случае будетпроблема)
Побитовое дополнение - это примитивная операция над битовыми векторами, а сложение - это просто обычное сложение битового вектора, которое не является ни действительным, ни неподписанным, оно делает и то, и другое.
Это разные примеры, 00000000 - 11111111
.Следует заметить, что правый операнд к вычитанию также известен как отрицательный 1 (что имеет смысл говорить, даже если смотреть в «беззнаковые очки», поскольку 11111111 + 00000001 = 00000000
и, следовательно, алгебраическое определение отрицания удовлетворяется), и мы знаем, что 0 - (-1) = 1
поэтому ответ должен быть 00000001
.Или мы можем использовать определение вычитания, например 00000000 - 11111111 = ~(~00000000 + 11111111) = ~(11111111 + 11111111) = ~11111110 = 00000001