我使用的是不支持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;
}
,但功能有问题;我怎么能解决它?
答案 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中引入的,所以如果你的编译器不太古老,你很可能会有这个功能。