Два 32-битных целых значения A и B обрабатываются для получения 32-битных целых чисел C и D согласно следующим правилам. Какое из правил (правил) обратимо?
то есть возможно ли получить A и B с данными c и D во всех условиях?
A. C = (int32) (A + B), D = (int32) (A-B)
B. C = (int32) (A + B), D = (int32) ((A-B) >> 1)
C. C = (int32) (A + B), D = B
D. C = (int32) (A + B), D = (int32) (A + 2 * B)
E. C = (int32) (A * B), D = (int32) (A / B)
Несколько вопросов о целочисленной арифметике. Модульное сложение образует математическую структуру, известную как абелева группа. Как насчет подписанного дополнения? Это также коммутативно (вот где появляется «абелева» часть) и ассоциативно, это образует п абелева группа?
Учитывая, что целочисленное сложение коммутативно и ассоциативно, C, по-видимому, верно, потому что мы можем получить A с помощью (A + (B-B)). А как насчет D? Можем ли мы предположить, что 2 * B = B + B
ул. B = A+B+B-(A+B)
?
И умножение является более сложным, но я знаю, что оно не может быть получено, если есть переполнение.
Это цитата из 5 [expr] абзаца 4:
Если во время вычисления выражения результат не определен математически или не находится в диапазоне представимых значений для его типа, поведение не определено.
Что делает переполнение для целых чисел без знака, определено в 3.9.1 [basic.fundamental] параграфе 4:
Целые числа без знака должны подчиняться законам арифметики по модулю 2N где n — количество битов в представлении значения этого конкретного размера целого числа.
По сути, это говорит о том, что вы не должны переполняться при использовании целочисленной арифметики со знаком. Если вы это сделаете, все ставки сняты. Это означает, что целые числа со знаком не образуют абелеву группу в C ++.
Других решений пока нет …