At the moment, I'm going to assume that the inputs are signed integers.
. , , (, , ), .
, , , .
, , 32- , , - . , a, b, c d 16 . , :
al = a & 0xffff;
au = a >> 16;
bl = b & 0xffff;
bu = b >> 16;
:
a * b
... - , :
(al + au << 16) * (bl + bu << 16)
, :
al * bl + au<<16 * bl + al * bu<<16 + au<<16 * bu<<16
a * (b * c)= (a * b) * c, - , :
al * bl +
(au * bl) << 16 +
(al * bu) << 16 +
(au * bu) << 32
: , , 16 , 32 , 32- .
. , . -, , . :
bool carry(unsigned a, unsigned b) {
return a > (std::number_limits<unsigned>::max() - b);
}
+ < 16 + < 32. 32- , mid . lower, - upper. ( ) 32- , lower + mid_lower, - upper + mid_upper + carries.
, , , , .
, , .