if(adc_val & 0x2000) adc_val |= (0xffffffff - 0x3ffff); Только вместо "магических чисел" макросы.
На мой взгляд, писать нужно прямо, что нужно делать, не используя побочные эффекты.
Компилятор разберётся, а самому может, через какое-то время, оказаться неожиданно непонятным.