我有一段非常简单的 C 代码,它给了我奇怪的结果。我正在为 Micaz 微粒开发一个简单的无线传感器网络应用程序。它似乎有 ATmega128L 8 位 AVR 微处理器。我正在使用 AVR studio 编写和编译代码。
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。只是不知道为什么。