2016-08-15 19 views
-4

long longタイプをサポートしていないMCUを使用しています。 long longにキャストできません。32ビット32倍の32ビット32ビット乗算

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

多くの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型をサポートしていません。私はそのようなfuctionを参照しますが、私の単体テストでは失敗しました。 UINT32 umulm(UINT32 a、UINT32 b) { UINT32 i、r; r = 0; (a&(1 << i)) r + = b >>(32-i)については、 for(i = 1; i <32; i ++) return r; } –

+3

@JosephQu関連するコード*を質問に追加してください*。 –

+1

@JosephQu:簡単な解決策:標準準拠のコンパイラを使用します。 – Olaf

関連する問題