負数を補数表現するのが普通じゃないかな?
 この場合はデータの16bitしか使っていないから
 2^16-1の補数を取る=2^16-xを求める=16bitのビット反転
つまり
for(...) {
 tempp[i] = datap1[i] +(0x10000- datap2[i]);
}
 を取ると 全体で表現出来る最大の数-N+1 になるから
 さらに1を加算する
 つまり後の正規化の時に桁上がりレジスタのadv初期値を1にする

補数表現だから負数かどうかはMSBで判定する