私は奇妙な結果をもたらす非常に単純な C コードを持っています。Micaz モート用の単純なワイヤレス センサー ネットワーク アプリケーションを開発しています。ATmega128L 8 ビット AVR マイクロプロセッサを搭載しているようです。コードの作成とコンパイルには AVR スタジオを使用しています。
uint16_t myvariable;
uint16_t myresult;
myresult = myvariable*256;
myvariable が 3 のとき、myresult が常に 512 にリセットされることがわかりました。私の推測では、そのようなリテラル数 256 と uint16_t の混合が魔法のように問題を引き起こしているのです。しかし、理由はわかりません。誰かがこれについて詳細な説明をしてもらえますか? どんな助けにも感謝します!
より詳細なソースコードは次のとおりです。
static uint16_t myvariable[2];
static uint8_t AckMsg[32];
uint16_t myresult[MAX_SENDERS];
void protocol()
{
if(thisnodeid != 5){ // sender nodes
while (1)
{
if(AckReceived && !MsgSent) {
// If ACK received and a new message not sent yet,
// send a new message on sending node.
}
else if(!AckReceived && MsgSent)
{
lib_radio_receive_timed(16, 32, AckMsg, 120);
myvariable[0] = AckMsg[0];
myvariable[1] = AckMsg[1];
// Bug!!!, variable overflowed.
myresult[thisnodeid] = 256*myvariable[1] + myvariable[0];
}
}
}
}
私が本当に理解したいのは、コンパイラが次のコード行をどのようにコンパイルするかということです。これは、このコード行がバグの原因であることを知っているからです。事前に情報をありがとう!
myresult[thisnodeid] = 256*myvariable[1] + myvariable[0];
myvariable[1]=3、myvariable[0]=0 の場合、常に myresult[] = 512 になります。768 が常に 512 にリセットされるように見えます。理由はわかりません。