At least with adders (not sure about multipliers coz there are different designs of varying complexity) you add the bits one with the other, and if you add say 0b1 + 0b1 = 0b10 you can’t represent that as single bit, so you return “partial product” and a carry. So prod = 0b0 + carry = 0b1. You also actually take the previous carry in so actually:

carry + op1 + op2 = prod and carry

0b0 + 0b1 + 0b1 = 0b0 and 0b1

As you can see since you have both carry in and carry out you can chain addition to arbitrary word size. (again, word as in the native register size)

multiplication is much more complex, involved shifting and adding at minimum and the product is always 2xbits of the op bit width.

I only implemented multiplication once, and I just cut it half way (didn’t compute the full product) to save “die” size.