Похоже, вы ожидаете 12-битные значения дополнения 2 с.
В этом пороге, то есть наивысшем положительном значении, является 2047 (0x8ff). Чтобы получить диапазон значений -2048 ... 2047 (диапазон для обычного "квазисимметричного" 12-битного представления), просто сделайте это с переменной, которая получила значение.
if(iValue>2047) /* note that in the wide range of the receiving variable, this makes sense */
{
iValue-=4096; /* in the 16bit (or more) representation, this makes sense */
}
Этот код, конечно, делаетпредположим, что считанные значения находятся в пределах 0 .... 4095 и что принимающая переменная шире, чем 12 бит, но, похоже, вы это делаете.
Может показаться заманчивым выполнение 16-битных битовых операций, но для этого потребуются предположенияна битовой ширине содержащей переменную. Простое вычитание ТОЛЬКО соответствующего значения делает предположение о представленном меньшем диапазоне значений, а не о внутреннем представлении в переменной.