В случае, если N=2b, тогда
(N+y)(N+v) = N²−N(|y|+|v|)+yv ≡ yv (mod N), и, таким образом, можно множить дополнительные коды, растянув их до длины N².
Как поступать, не растягивая? — ну, добавить N(|y|+|v|), наверное.
Итак, ваши числа ДЕВЯТИбитные (N=512), и символизируют y=−217, v=−161. Ну, соответственно N+y=295, N+v=351.
(N+y)(N+v) + N(|y|+|v|) = 295·351 + 512·(217+161) = 297081,
N² = 262144,
Выкинем один переполненный бит 297081−262144 = 34937,
Ну что, есть у нас (−217)·(−161)?
Что вы неправильно сделали…
1. Я не понимаю, что здесь делают 2(|y|+|v|).
2. Числа у нас ДЕВЯТИбитные, так что и начальные единицы нельзя выкидывать, и сдвиг должен быть на девять бит, а не на восемь или десять.
Если попробовать отрубить знаковый бит и N²=65536…
N=256, y=−217, v=−161, N+y=39, N+v=95.
(N+y)(N+v) + N(|y|+|v|) = 39·95 + 256·(217+161) = 100473,
вычтем переполненный бит 100473−65536=34937
Но тогда придётся выкинуть ОБЕ начальных единицы, а сдвиг делать на 8.
С отрубленными знаковыми битами только знание, что оба числа отрицательные, позволяет трактовать эти 34937 как 16-битное беззнаковое. А то мы же отрубили все признаки этого, верно?
А то вы одну выкинули, а другую оставили.