Этот код всегда оценивается как ложный? Обе переменные являются двумя знаковыми дополнениями.
~x + ~y == ~(x + y)
Я чувствую, что должно быть какое-то число, которое удовлетворяет условиям. Я пытался проверить числа между, но так -5000
и 5000
не достиг равенства. Есть ли способ установить уравнение, чтобы найти решение для условия?
Будет ли замена одного на другой причиной коварной ошибки в моей программе?
true
даже если они никогда не будут принимать строгое дополнение к двум.Ответы:
Предположим ради противоречия, что существуют некоторые
x
и некоторыеy
(mod 2 n ) такие, чтоВ дополнение к двум * мы знаем, что
Отмечая этот результат, мы имеем,
Отсюда и противоречие. Поэтому
~(x+y) != ~x + ~y
для всехx
иy
(мод 2 н ).* Интересно отметить, что на машине с арифметикой дополнения равенство действительно справедливо для всех
x
иy
. Это потому, что под чьим-то дополнением~x = -x
. Таким образом,~x + ~y == -x + -y == -(x+y) == ~(x+y)
.источник
~x == -(x+1)
, так~(x+y) == ~x + ~y
подразумевает,-(x+y+1) == -(x+1) + -(y+1)
подразумевает-1 == -2
Два дополнения
На подавляющем большинстве компьютеров, если
x
это целое число, то-x
представляется как~x + 1
. Эквивалентно~x == -(x + 1)
. Создание этой подстановки в вашем уравнении дает:что является противоречием, поэтому
~x + ~y == ~(x + y)
всегда ложно .Тем не менее, педанты будут указывать, что C не требует дополнения до двух, поэтому мы должны также рассмотреть ...
Свой комплимент
В дополнение ,
-x
просто представлен как~x
. Ноль - это особый случай, имеющий представления как all-0's (+0
), так и all-1's (-0
), но IIRC, C требует,+0 == -0
даже если они имеют разные битовые комбинации, так что это не должно быть проблемой. Просто заменить~
с-
.что верно для всех
x
иy
.источник
+0 == -0
. Наконец то, что имеет смысл в C. :)Рассмотрим только самый правый бит обоих
x
иy
(т.е. если онx == 13
находится1101
в базе 2, мы рассмотрим только последний бит, а1
) Тогда есть четыре возможных случая:х = 0, у = 0:
х = 0, у = 1:
х = 1, у = 0:
х = 1, у = 1:
Вы можете показать, что самый правый бит всегда будет отличаться в левой и правой частях уравнения с учетом любого возможного ввода, поэтому вы доказали, что обе стороны не равны, поскольку у них есть хотя бы один перевернутый бит друг от друга.
источник
Если количество битов равно n
Сейчас,
Следовательно, они всегда будут неравными, с разницей в 1.
источник
~
работу с нефиксированными числами ширины?Подсказка:
x + ~x = -1
(мод 2 н )Предполагая, что целью этого вопроса является проверка вашей математики (а не навыков чтения спецификаций), вы должны получить ответ.
источник
Это можно доказать как в одном, так и в двух (и даже в 42-х годах):
Теперь позвольте
a = y
и мы имеем:или:
Следовательно, в дополнение к этому
~0 = -1
, утверждение неверно.В дополнение к этому
~0 = 0
, утверждение верно.источник
Согласно книге Денниса Ритчи, Си не реализует дополнение двух по умолчанию. Поэтому ваш вопрос не всегда может быть правдой.
источник
Позвольте
MAX_INT
быть int, представленный как011111...111
(для скольких битов не существует). Тогда вы это знаете,~x + x = MAX_INT
и~y + y = MAX_INT
, следовательно, поэтому вы наверняка будете знать, что разница между~x + ~y
и~(x + y)
есть1
.источник
С не требует, чтобы два дополнения были тем, что реализовано. Однако для целого числа без знака применяется аналогичная логика. Различия всегда будут 1 по этой логике!
источник
Конечно, C не требует такого поведения, потому что не требует представления дополнения до двух. Например,
~x = (2^n - 1) - x
&~y = (2^n - 1) - y
получит этот результат.источник
Ах, фундаментальная дискретная математика!
Проверьте закон де Моргана
Очень важно для логических доказательств!
источник