Для задания домашней работы мне нужно написать функцию на C, которая объединяет два знаковых целых числа, но возвращает INT_MAX, если бы было положительное переполнение и INT_MIN, если бы быть отрицательным переполнением. Я должен соблюдать очень строгие ограничения в отношении того, какие операторы я могу использовать. Все целые числа находятся в форме двух дополнений, правые сдвиги арифметичны, а целочисленный размер является переменным (я могу найти его с sizeof (int) < < 3). Я не могу использовать contitionals, циклы, операторы сравнения или кастинг. Я могу использовать только побитовые и логические операторы, сложение и вычитание, тесты равенства и целочисленные константы INT_MAX и INT_MIN.Насыщенное целочисленное целочисленное сложение с только побитовыми операторами в C (HW)
Я знаю, что переполнение может быть обнаружено, если два входа имеют один и тот же знак, а результат имеет другой знак. Я дошел до того, что у меня есть флаг, показывающий, что уравнение переполнено. Я понятия не имею, как добраться оттуда до конечного продукта. Это то, что я до сих пор:
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
}
Я пытаюсь следовать ответ изображенную Bitwise saturated addition in C (HW), но я застрял на той части, где я должен заполнить целое с тем же немного для всех, кроме бит знака (1 переходит в 0111..11, а 0 - 0000.00). Я не знаю, что такое «комбинация сдвигов и ОР».
Почему голос? Это кажется достаточно обоснованным. – Brian