【问题标题】:Get high 32bit of 32x32 multiply获得 32x32 乘法的高 32 位
【发布时间】: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


【解决方案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;

&lt;stdint.h&gt; 是在 C99 中引入的,因此如果您的编译器不是太古老,您很可能会使用此功能。

【讨论】:

  • 我使用的编译器不支持 long long 类型。我指的是这样的功能,但它在我的单元测试中失败了。 UINT32 umulm(UINT32 a, UINT32 b) { UINT32 i, r; r = 0; for (i = 1; i > (32 - i);返回 r; }
  • @JosephQu 请在问题中添加相关代码
  • @JosephQu:简单的解决方案:使用符合标准的编译器。
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2017-03-11
  • 2015-05-06
  • 1970-01-01
相关资源
最近更新 更多