2016-08-15 28 views
-4

我使用的MCU不支持long long類型。我不能投到long long獲取高32位的32x32乘法

我需要一個函數來獲得32位/ 32位乘法的高32位。

86 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

許多32位CPU不支持64位類型。但任何兼容的C編譯器都應該。由於你的代碼是x86,你應該使用一個兼容的編譯器。尋找一個不兼容的編譯器比一個兼容的編譯器更難。 – Olaf

+1

你想在x86或x86以外的架構上做到這一點。從你的問題來看,這不是很清楚。 – rjp

+1

除非你明確你想要的是什麼機器,唯一的答案就是自己編寫一個多精度乘法函數。 – EOF

回答

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推出,因此,如果你的編譯器是不是太古老,你很可能有此功能可用。

+0

我使用的編譯器不支持long long類型。我提到這種功能,但是在我的單元測試中失敗了。UINT32 umulm(UINT32 a,UINT32 b) UINT32 i,r; r = 0;對於(i = 1; i <32; i ++) if(a&(1 << i)) r + = b >>(32-i) return r; } –

+3

@JosephQu請將相關代碼*添加到問題*中。 –

+1

@JosephQu:簡單的解決方案:使用標準兼容的編譯器。 – Olaf