среда, 19 сентября 2018 г.

Забавный трюк

Есть код:
int var = ...;
Понадобилось отследить событие когда var становится больше 1.
if(var > 1)
{
...
}
Потом понадобилось отследить событие когда var может принять и отрицательное значение.
if((unsigned)var > 1)
{
...
}
Это работает поскольку знаковые отрицательные целые в беззнаковой трактовке имеет очень большую величину.

Если дописать до варианта
if((unsigned)var > n)
{
...
}
то получаем код эквивалентный (конечно, если
n < MAX_INT)
довольно сложному условию
if( ( var < 0 ) || ( var > n ))
{
...
}
В ассемблерном виде это довольно сложная конструкция, в то время как
if((unsigned)var > n)
намного проще.

Это просто занятный трюк с небольшой оптимизацией. Может быть полезен.

Комментариев нет:

Отправить комментарий