Целочисленная арифметика при переполнении

Два 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)?

И умножение является более сложным, но я знаю, что оно не может быть получено, если есть переполнение.

0

Решение

Это цитата из 5 [expr] абзаца 4:

Если во время вычисления выражения результат не определен математически или не находится в диапазоне представимых значений для его типа, поведение не определено.

Что делает переполнение для целых чисел без знака, определено в 3.9.1 [basic.fundamental] параграфе 4:

Целые числа без знака должны подчиняться законам арифметики по модулю 2N где n — количество битов в представлении значения этого конкретного размера целого числа.

По сути, это говорит о том, что вы не должны переполняться при использовании целочисленной арифметики со знаком. Если вы это сделаете, все ставки сняты. Это означает, что целые числа со знаком не образуют абелеву группу в C ++.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]