Для домашнего задания мне нужно написать функцию на C, которая складывает два целых числа со знаком, но возвращает INT_MAX, если будет положительное переполнение, и INT_MIN, если будет отрицательное переполнение. Я должен соблюдать очень строгие ограничения в отношении того, какие операторы я могу использовать. Все целые числа представлены в форме дополнения до двух, сдвиги вправо являются арифметическими, а размер целого числа является переменным (я могу найти его с помощью sizeof (int) ‹---------------- 3). Я не могу использовать контиционалы, циклы, операторы сравнения или приведение типов. Я могу использовать только побитовые и логические операторы, сложение и вычитание, проверки равенства и целочисленные константы INT_MAX и INT_MIN.
Я знаю, что переполнение может быть обнаружено, если два входа имеют одинаковый знак, а результат имеет другой знак. Я дошел до того, что у меня есть флаг, показывающий, переполняется ли уравнение. Я не знаю, как оттуда добраться до конечного продукта. Вот что у меня есть на данный момент:
int saturating_add(int x, int y){
int w = sizeof(int)<<3;
int result = x+y;
int signX = (x>>w-1)&0x01;//Sign bit of X
int signY = (y>>w-1)&0x01;//Sign bit of Y
int resultSign = (result>>w-1)&0x01; //Sign bit of result
int canOverflow = ~(signX ^ signY); //If they're the same sign, they can overflow
int didOverflow = (resultSign^signX)&canOverflow; //1 if input signs are same and result sign different, 0 otherwise
}
Я пытаюсь следовать ответу, показанному на Побитовое насыщенное сложение в C (HW), но я застрял в той части, где мне нужно заполнить целое число одним и тем же битом для всех, кроме бит знака (1 идет на 0111..11, а 0 идет на 0000.00). Я понятия не имею, что это за «комбинация смен и операций».