【发布时间】:2018-09-16 20:59:38
【问题描述】:
我使用的 MCU 不支持 long long 类型。我不能投到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;
}
,但是函数有问题;我该如何解决?
【问题讨论】:
-
许多 32 位 CPU 不支持 64 位类型。但是任何兼容的 C 编译器都应该。由于您的代码是 x86,因此您应该使用兼容的编译器。实际上找到一个不合规的编译器比一个合规的更难。
-
您是要在 x86 还是 x86 以外的架构上执行此操作。从你的问题看不太清楚。
-
除非你明确你想要这个的确切机器,否则唯一的答案是自己编写一个多精度乘法函数。
-
您使用什么编译器,用于什么目标系统?
-
This answer 解释了如何获得 64x64 位乘法的高 64 位。很容易适应 32x32。
标签: c