int tmp = 0x040000; ADC_Data =((ADC_Data + tmp) & 0x7FFFF) - tmp;
//т.е. сначала приводим все числа к числам без знака
(положительным), ограничивая разрядность 18 битами, потом отнимаем
константу приведения уже в 32 битах. Работает сие без условных
переходов и неизбежного при этом сброса конвейера. Конечно если у вас есть тест бита и бранч по результату то можно обойтись двумя-тремя командами ассемблера .