Как мы можем позаботиться о переполнении, происходящем при замене двух переменных, без использования третьей переменной. Я считаю, что решение XOR можно использовать только для целых чисел. а как насчет других типов переменных?
Переполнение стека во время SWAP
Ответы (6)
Это не ответ, но он не подходит для комментария.
При каких обстоятельствах вы будете работать так близко к краю доступного хранилища стека, что дополнительное использование временной переменной для свопа вызовет у вас трудности?
Я мог видеть некоторые встроенные сценарии, но мне трудно представить сценарий, в котором у вас было бы так мало места в стеке, что это имело бы значение (когда вы не пишете код на языке ассемблера).
XOR будет работать для всего, что вы можете заставить обработать свой оператор XOR; это свойство двоичных данных, а не двоичных данных, используемых для представления целых чисел.
Не делая этого вообще. Алгоритм обмена XOR — классный хак. Его не следует использовать в рабочем коде.
Решение XOR работает с любым типом, который можно копировать побитно, а не только с целыми числами. Однако не выполняйте XOR переменной с самой собой: т.е.
int x = 10;
int *p1 = &x;
int *p2 = p1;
*p1 = *p1 ^ *p2;
*p2 = *p1 ^ *p2;
*p1 = *p1 ^ *p2;
/* now x == 0 :( */
Что не так с XCHG? Стек не нужен, нет переполнения (флаг переноса)? ставь либо :).
a = a + b;
b = a - b;
a = a - b;
Это будет работать для целых чисел и чисел с плавающей запятой.