Николай Коровин (26.02.2016 21:54, просмотров: 215) ответил mr-x на Сейчас проверить, к сожалению, не могу. Всё на работе осталось до понедельника.
Тьфу, во я тупой, а. Не заметил, что второе число — отрицательное! Естественно, если из положительного вычесть отрицательное, получим большой положительный результат. А обреза́ть его до 16, рассматривая старший бит как знаковый (и перекидывая его в минус) — компилятор вовсе не должен! Потому что размер выбирается нативно платформе.
Вот теперь всё яснее ясного.
int16_t a1, a2, a3;
a1 = 0x2423; //9251 dec
a2 = 0x85c1; //-31295 dec
a3 = a1 - a2; // == 0x9e62 == -24990
(int)inner_register = (int)a1 - (int)a2; //40546 > 0 !!!
Из двух моих вариантов первый будет работать как задумано (обрезать старшие биты до 16 и из 40546 делать -24990), а второй — нет.
Блин, внимательнее надо быть, заметил бы, что a2 < 0 — сразу бы и ответ дал исчерпывающий.