gpt4 book ai didi

c - 将 uint16_t 变量与数字相乘的奇怪结果

转载 作者:太空狗 更新时间:2023-10-29 15:08:15 24 4
gpt4 key购买 nike

我有一段非常简单的 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。只是不知道为什么。

最佳答案

我在标准系统上试过这段代码没有任何问题:

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#define MAX_SENDERS 10
static uint16_t myvariable[2];
static uint8_t AckMsg[32];
uint16_t myresult[MAX_SENDERS];
main()
{
AckMsg[0] = 0;
AckMsg[1] = 3;
myvariable[0] = AckMsg[0];
myvariable[1] = AckMsg[1];
myresult[0] = 256*myvariable[1] + myvariable[0];
printf("%d", (int)myresult[0]);
}

所以要调试你的代码,你应该尝试替换这些行:

myvariable[0] = AckMsg[0];
myvariable[1] = AckMsg[1];
// Bug!!!, variable overflowed.
myresult[thisnodeid] = 256*myvariable[1] + myvariable[0];

作者:

uint16_t tmp;
myvariable[0] = AckMsg[0];
myvariable[1] = AckMsg[1];
tmp = 256*myvariable[1] + myvariable[0];
myresult[thisnodeid] = 256*myvariable[1] + myvariable[0];
printf("%d %d\n", (int)(AckMsg[0]), (int)(AckMsg[1]));
printf("%d %d\n", (int)(thisnodeid), (int)(MAX_SENDERS));
printf("%d %d\n", (int)(myvariable[0]), (int)(myvariable[1]));
printf("%d %d\n", (int)(tmp), (int)(myresult[thisnodeid]));

这可能会带来有关问题根源的有用信息。

如果您无法在调试器中打印某些内容,您可以尝试以下操作:

uint16_t i = 0;
uint16_t n = 255;
myresult[thisnodeid] += myvariable[1];
while (i != n) {
myresult[thisnodeid] += myvariable[1];
i += 1;
}
myresult[thisnodeid] += myvariable[0];

它会很慢,但它可以让您检测实际发生溢出的位置,因为唯一大于 255 的变量是 myresult

关于c - 将 uint16_t 变量与数字相乘的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15889212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com