Беззнаковое двоичное целочисленное вычитание - PullRequest
0 голосов
/ 19 сентября 2018

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

Поскольку целые числа без знака не могут быть отрицательными, к чему будет относиться это выражение?

1 Ответ

0 голосов
/ 19 сентября 2018

Да, по крайней мере, под общим определением.«Не может быть отрицательным» не означает, что вычитание становится частичной функцией, т.е. «иногда невозможно».Это означает, что есть некоторый результат, и по определению он неотрицательный, интерпретируя старший бит как имеющий положительный вес, а не отрицательный, поэтому просто не существует комбинации битов, которая интерпретируется как"отрицательное значение".

Это действительно только биты.Целые числа со знаком и без знака представляют собой немного разные интерпретации значения битов (например, для 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

...