从0递增整数变为负数

时间:2014-06-14 23:51:18

标签: c embedded

我正在进行嵌入式系统项目,我试图从红外传感器(使用'脉冲宽度调制')解调数据。下面的代码只是等待IR传感器开始脉冲,然后测量每个高低脉冲的宽度(持续时间)。

在这段代码中,我有一个循环,我在这里增加一个整数:

irPulseSet irReadPulse()
{
irPulseSet outputPulseSet;
int pulseCount = 0;

int finished = 0;

while(1)
{
    int lowPulse = 0;
    int highPulse = 0;

    while( bit_is_clear( irSensorPin , irSensorPinNo ) )
    {
        highPulse++;
        _delay_us( 20 );
    }

    while( !bit_is_clear( irSensorPin , irSensorPinNo ) )
    {
        if ( lowPulse > 3250 )
        {
            finished = 1;
            break;
        }
        lowPulse++;
        _delay_us( 20 );
    }

    if ( finished )
        break;

    outputPulseSet.pulses[pulseCount][0] = highPulse * 20;
    outputPulseSet.pulses[pulseCount][1] = lowPulse * 20;

    pulseCount++;
}

// Assign pulse count to output pulse set
outputPulseSet.pulseCount = pulseCount;

return outputPulseSet;
}

因为这是一个嵌入式系统项目,我的资源有限,所以我用LCD显示器进行调试(因为电路无法连接到电脑)

打印每个脉冲

int irPrintPulses( irPulseSet pulseSet )
{
    int counter;
    for( counter = 0; counter <= pulseSet.pulseCount; counter++ )
    {

       LCDClearScreen();
        char printStr[100];

        sprintf( printStr , "H%iL%i;%i " , pulseSet.pulses[counter][0] , pulseSet.pulses[counter][1] , counter  );
        LCDSendString( printStr );
        _delay_ms(1000);
    }

    _delay_ms(5000);
    LCDClearScreen();
    LCDSendString( "Finished pulse print!" );
    _delay_ms(1000);
    LCDClearScreen();

    return 0;
}

lowPulse int似乎有时是负数(例如-1054的值)。我完全感到困惑,因为它首先被定义为0而且我所做的一切都是增加它,所以它怎么会变成负面的呢?

2 个答案:

答案 0 :(得分:3)

你有X位来表示一个数字:1位用于信号,X - 1位用于值

假设您有一个用4位表示的数字:

0000 = 0

0001 = 1

...

0111 = 7

如果在此处递增1,则将更改第一位(信号位)

1000 = -8

尝试下面的代码

#include <stdio.h>
#include <limits.h>
int main()
{
   int i = INT_MAX;

   printf("%d\n", i);   
   printf("%d\n", i + 1);
   printf("%u\n", i + 1);

   if(i > 0)
      printf("greater\n");

   i++;

   if(i < 0)        
      printf("what kind of witchcraft is that?");
}

一旦你在最大值之后加一个它将翻转到最大负值,第三个printf打印为无符号值(使用第一位不是信号而是值)...

答案 1 :(得分:0)

由于这是嵌入式的,我将假设您正在使用16位整数。结果,如果你将highPulse增加32,768次,它将溢出并变为负数。值从0x7fff(正)转换为0x8000(负)。

如果延迟循环为20 usec,则需要655.36毫秒。任何时候第一个循环必须等待这个位转换的长时间,你将得到负数。我原以为这很有可能。

你有32位长吗?如果是这样,最简单的解决方案可能是将它们用于这些计数器。然后溢出需要大约40,000秒,这应该足够了。