Два 32-битных целых числа A и B обрабатываются для получения 32-битных целых чисел C и D в соответствии со следующими правилами. Какое из правил обратимо? т. е. возможно ли получить А и В при данных с и 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+(BB)). А как насчет D? Можем ли мы предположить, что 2 * B = B + B
ул. B = A+B+B-(A+B)
?
А умножение сложнее, но я знаю, что его нельзя получить, если есть переполнение.
unsigned
целочисленные типы образуют группы относительно сложения в C и C++. Знаковое сложение обычно не может уже по той простой причине, чтоINT_MIN
обычно не имеет обратного в обычном представлении 2дополнения. - person Jens Gustedt   schedule 06.10.2013INT32_MIN
вместоA
иB
, и реализация определяет, что произойдет в любом случае, поэтому ответа нет. У меня есть подозрение, что вы пытаетесь получить последовательный ответ на некорректное упражнение. Часто мы видим здесь такие упражнения, которые исходят от не очень хорошо информированных учителей, которые принимают дополнение до двух как должное и никогда не слышали о сигналах, которые можно подать в случае переполнения. Делайте такие вещи не сint32
(кстати, стандартныйtypedef
называетсяint32_t
), а сuint32_t
. Откуда у вас эти вопросы? - person Jens Gustedt   schedule 06.10.2013E = C - D = A + B - B = A
и B с помощьюC - E
. Что вы думаете? И я принимаю D как правильный ответ, см. мои вопросы. - person Joey.Z   schedule 08.10.2013