пусть меня поправят, если я ошибаюсь но нужно анализировать знаковый бит результата, а не только CY
это примерно так (на сях):
signed short result = arg1 + arg2;
if (OV)
{
if (CY) result = 0x8000; // -32768
else
if (result & 0x8000) result = 0x7FFF; // 32767
else result = 0x8000; // -32768
}
return result;
Для вычитания предлагаю сделать самостоятельно