Переполнение стека во время SWAP - PullRequest
2 голосов
/ 05 апреля 2009

Как мы можем позаботиться о переполнении, происходящем при замене двух переменных без использования третьей переменной. Я считаю, что решение XOR можно использовать только для целых чисел. а как насчет других типов переменных?

Ответы [ 6 ]

4 голосов
/ 05 апреля 2009

Это не ответ, но он не помещается в комментарии.

При каких обстоятельствах вы будете работать так близко к краю доступного стекового хранилища, что дополнительное использование временной переменной для подкачки вызовет у вас трудности?

Я мог видеть некоторые встроенные сценарии, но мне сложно представить сценарий, в котором вы будете настолько ограничены в пространстве стека, что это будет иметь значение (когда вы не пишете код на языке ассемблера).

2 голосов
/ 05 апреля 2009

Не делая этого вообще. Алгоритм обмена XOR - это крутой взлом. Это не должно использоваться в производственном коде.

2 голосов
/ 05 апреля 2009

XOR будет работать для всего, что вы можете заставить вашего оператора XOR обрабатывать; это свойство двоичных данных, а не двоичных данных, используемых для представления целых чисел.

0 голосов
/ 02 июля 2009
a = a + b;
b = a - b;
a = a - b;

Это будет работать для целых чисел и с плавающей точкой.

0 голосов
/ 02 июля 2009

Что не так с XCHG ? Нет необходимости в стеке, нет переполнения (флаг переноса)? установите либо:).

0 голосов
/ 05 апреля 2009

Решение XOR работает с любым типом, который может быть скопирован по битам, а не только с целыми числами. Однако не используйте XOR для переменной с самим собой: т.е.

int x = 10;
int *p1 = &x;
int *p2 = p1;

*p1 = *p1 ^ *p2;
*p2 = *p1 ^ *p2;
*p1 = *p1 ^ *p2;

/* now x == 0 :( */
...