Если x и y являются (подписанными) целыми числами, то ~x+~y+1 == ~(x+y); всегда верно в C?

Я читаю "Компьютерные системы: взгляд программиста", а в главе 2 "Задача домашнего задания 2.81" представлено следующее задание:

"2.81 ◆ Мы выполняем программы на компьютере, где значения типа int являются 32-битными. Они представлены в виде дополнения к двум, и они арифметически сдвинуты вправо. Значения типа unsigned также являются 32-битными.

Мы генерируем произвольные значения x и y и конвертируем их в значения без знака следующим образом:

/* Create some arbitrary values */
int x = random();
int y = random();

Для каждого из следующих выражений C вы должны указать, всегда ли выражение дает 1. Если оно всегда дает 1, опишите основные математические принципы. В противном случае приведите пример аргументов, которые приводят к 0."*

Я заинтересован в пункте C, который стоит:

C. ~ x + ~ y + 1 == ~ (x + y)

Я попытался скомпилировать много примеров (включая крайние случаи с отрицательным и положительным переполнением) с различными значениями для x и y и обнаружил, что это обычно имеет место. Я понимаю, что это не доказательство, и хотя моя рабочая гипотеза состоит в том, что это верно, я не знаю почему. Мой вопрос заключается в том, справедлива ли она, и если да, то почему она была бы очень полезна (объясняя, почему эта задача под рукой).

* Брайант, Рэндал Е; О'Халларон, Дэвид Р. (2013). Компьютерные системы: взгляд программиста, Пирсон.

0 ответов

Другие вопросы по тегам