Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C uint16_t变量与数字相乘会产生奇怪的结果_C - Fatal编程技术网

C uint16_t变量与数字相乘会产生奇怪的结果

C uint16_t变量与数字相乘会产生奇怪的结果,c,C,我有一段非常简单的C代码,它给出了一个奇怪的结果。我正在为Micaz motes开发一个简单的无线传感器网络应用程序。它似乎有ATmega128L 8位AVR微处理器。我正在使用AVR studio编写和编译代码 uint16_t myvariable; uint16_t myresult; myresult = myvariable*256; 当myvariable为3时,我发现myresult总是重置为512。只是想知道为什么会这样。我的猜测是,这种文字数字256和uint16的混合神奇地

我有一段非常简单的C代码,它给出了一个奇怪的结果。我正在为Micaz motes开发一个简单的无线传感器网络应用程序。它似乎有ATmega128L 8位AVR微处理器。我正在使用AVR studio编写和编译代码

uint16_t myvariable;
uint16_t myresult;
myresult = myvariable*256;
当myvariable为3时,我发现myresult总是重置为512。只是想知道为什么会这样。我的猜测是,这种文字数字256和uint16的混合神奇地导致了这个问题。但我不知道为什么。有人能详细解释一下吗?谢谢你的帮助

更详细的源代码如下

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]);
}
作者:

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

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

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

,您可以发布演示问题的确切源代码吗,包括
myvariable
的赋值和打印
myresult
的代码?@JesusRamos:不一定。如果文本不适合
int
,那么它会尝试
long
,依此类推……您的描述引用的是
myvariable
myresult
,它们不会出现在源代码中。您的源代码没有显示它引用的大多数标识符的声明。你能给我们展示一个小的自包含的例子,以及它产生的输出与你期望的相比吗?@kevinlu:那么你有一个不一致的C实现。这并不是犯罪,但知道这一点会很好。(C标准要求
int
至少为16位。)溢出发生时
myvariable[1]
myvariable[0]
的值是多少?还有一些问题:1。您如何知道
myresult[]==512
?你打印了价值吗?在调试器中检查它?2.
int
真的是8位还是16位?3.你会回答我在最近的评论中提出的问题吗?如果你帮忙,不要让我们反复询问信息。帮帮我们,试试我们的建议。给我们看一个能说明问题的例子。
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];