調査中の組み込みプログラムのソースにこんな関数があった。
uint32 base[9]; //値は他所で代入される uint32 hoge(uint8 *array) { uint8 i , j; uint32 temp = 0; for(i = 9;i > 0;i--) { for(j = array[i-1];j > 0;j--) { temp += base[i-1]; } } return temp; }
一見しただけでは何をする関数なのか分からなかったが、どうやら2つの配列の要素ごとを掛け合わせた和を返す関数らしい。つまりこういうこと。
#define ARRAY_SIZE 9 uint32 base[ARRAY_SIZE]; //値は他所で代入される uint32 hoge(uint8 *array) { int i; uint32 sum = 0; for(i = 0; i < ARRAY_SIZE; ++i) { sum += array[i] * base[i]; } return sum; }
掛け算の代わりにforループで加算を繰り返しているのは、もしかして array[i] * base[i] がuint8型の最大値を超えてオーバーフローが起こることを心配しているのだろうか?
おそらく実際には、使用しているCPUのビット幅(32bit)で乗算が行われるのでオーバーフローは起こらないだろう。そもそも base[i] はもともと uint32型だし。それでもどうしても気になるなら
uint32 temp; //... temp = array[i]; sum += temp * base[i];
のように先に32bit変数に代入しておけば十分だと思う。
なんにせよ、乗算で済むところをループで加算する理由が分からない。また、しかもループカウントがデクリメントなのも不自然だと思う。