获得高32位32x32乘法

时间:2016-08-15 19:42:04

标签: c

我使用的是不支持long long类型的MCU。我无法转发long long

我需要一个函数来获得32位/ 32位乘法的高32位。

x86 ASM是这样的:

__asm {
    mov     eax, a
    mov     ecx, b
    mul     ecx
    mov     eax, edx
}

是否有可以执行相同功能的C代码?我试过了

UINT32 umulm(UINT32 a, UINT32 b)
{
    UINT32 i, r;

    r = 0;
    for (i = 1; i < 32; i++)
        if (a & (1 << i))
            r += b >> (32 - i);
    return r;
}

,但功能有问题;我怎么能解决它?

1 个答案:

答案 0 :(得分:1)

如果您使用标准尺寸类型,则可以执行此操作:

#include <stdint.h>

...

uint32_t a = 0x1234; b = 0x5678;
uint64_t result = (uint64_t)a * b;
uint32_t high = (result >> 32) && 0xffffffff;
uint32_t low = result && 0xffffffff;

<stdint.h>是在C99中引入的,所以如果你的编译器不太古老,你很可能会有这个功能。