Renesas Synergy™

FAQ 1004265 : 計算過程の途中でダブルワード型の数値を扱う場合の合理的なプログラムの記述方法

Q: 質問

計算結果はバイト型で収まる数値になりますが、 計算過程の途中でダブル・ワード型が必要な場合の最も合理的なプログラムの記述方法は?

例)
AのBにおける百分率Cを四捨五入して求める。

  計算式 : C=(A×100+B÷2)÷B

以下のような記述した場合、答えCをlong int宣言することになり、領域の確保が1バイトで済むところを、 4バイトも確保しなければなりません。
アセンブラで記述すれば#asm以降のような記述で答えが出ます。
このようにCで計算過程の途中の数値だけをダブル・ワード型にできますか?

void _x()
{
         c = ((unsigned long int)a * (unsigned long int)100 + (unsigned long int)b /
(unsigned long int)2) / (unsigned long int)b; /* #asm extrn _a extrn _b extrn _c movw ax, !!_a movw de, #100 muluw de movw bc, !!_b shrw bc, 1 addw de, bc addc x, #0 addc a, #0 movw bc, !!_b divux bc mov !!_c, e #endasm */ }

 


A: 回答

#pragma mul
#pragma div
unsigned int a, b;
unsigned char c;

void _x()
{
        c = (unsigned char)divux((unsigned long)(b / 2) + muluw(a, 100), b);
}

のように記述してください。

 

適用製品

78K0用コンパイラ [CC78K0]
78K0S用コンパイラ [CC78K0S]
他にご質問がございましたら、リクエストを送信してください