static inline u64 mul64_32x32(u32 u, u32 v){uint32_t u0, v0; //低16bit部分。uint32_t u1, v1; //高16bit部分。uint32_t w0, w1, w2, t;//存储计算中间结果。uint32_t x, y;//计算结果高32bit低32bit。u0 u 0xFFFF;//取u的低16bit。u1 u 16;//取u的高16bit。v0 v 0xFFFF;//取v的低16bitv1 v 16;//取v的高16bit.w0 u0 * v0;//u和v低16bit进行相乘。t u1 * v0 (w0 16);//u低16bit与v高16bit相乘的结果加上w0的进位进位到bit16~bit31结果。计算的结果为bit16~bit47。w1 t 0xFFFF;//t的低16bit。也就是bit16~bit31的值。w2 t 16;//t的高16bbitt的进位进位到bit32~bit47。w1 u0 * v1 w1;//更新为低 16 bit与高 16 bit相乘的结果加上之前的 w1。(计算结果为bit16~bit48的结果)。//x is high 32 bits, y is low 32 bitsx u1 * v1 w2 (w1 16);//计算结果的高32bit。u1*v1值为bit32~bir63的结果前面有解释是bit32~bit47的值w1位移取bit32~bit48的值。这样bit32~bit63的值就计算出来了。x的计算主要为综合了高位和进位的情况进位的情况尤为重要。y u * v;//计算结果的低32bit。低位的部分直接计算超出范围部分会被自动溢出/截断但不影响低32bit的结果。所以保留下来的也就只有低bit0~bit31结果是正确的。return(((uint64_t)x 32) | y);}大家可能会不太明白第三部分的计算。大家看看我们两位数的乘法是如何计算的呢方法也是类似的可以把32bit的数据看做作是两位十进制数相乘十位是u1和v1,个位是u0和v0,两个最大2位数相乘不会超过4位数所以两个32bit的数相乘不会超过64bit方法也就可行。通过这样的方法还可以实现在32位的CPU实现64位数据的乘法返回128位的数据。但是计算的复杂程度更高。如果要实现有符号的32bit相乘那情况将也会更加复杂。Disclaimer / 免责声明:本文仅代表作者在撰写和修改时的个人观点不代表当前或未来立场。文中观点和内容未经学术机构或标准组织验证作者不对其准确性、完整性或可靠性作任何保证。请读者仅供参考并自行核实相关信息。本文旨在探索与经验分享因篇幅及作者水平所限难免存在疏漏欢迎批评指正。如有问题或交流建议请联系flourishinggardenoutlook.com。copyright / 版权声明:本文为作者原创。引用或转载需注明“转自或引用自 flourishinggardenoutlook.com”。 未经注明来源的擅自使用、抄袭或传播行为均被禁止。