以下示例不能像我预期的那样(在条件中使用“>”)在8位机器上使用GCC,而在Linux 64位上也不行。如果我创建Timer_Secs和FutureTimeout_1Minute f.ex. 16位宽(int在这种情况下是16位)它可以正常工作(在条件中使用“>”)。
所以,为了让这个符号在8位上有效,我似乎必须在条件中使用“==”。
{
// Example with 8-bit only as tested with GCC 3.2 on AVR ATmega 128
unsigned int Cnt1 = 0; // 16 bits (kind of system clock)
unsigned int Cnt2 = 0; // 16 bits (observer, see what happens)
signed char Timer_Secs = 0; // 8 bits with sign
signed char FutureTimeout_1Minute = 60; // 8 bits with sign
while (Cnt1 < 602)
{ // ##
if ((Timer_Secs - FutureTimeout_1Minute) == 0)
{
FutureTimeout_1Minute += 60; // Overflow/underflow allowed,
// so wraps and changes sign
Cnt2++;
} else {} // No code
Timer_Secs++;
Cnt1++;
}
// ##
// Cnt2 is 35 if > 0 above #define AFTER_F(a,b) ((a-b)>0)
// Cnt2 is 35 if >= 0 above #define AFTER_EQ_F(a,b) ((a-b)>=0)
// Cnt2 is 10 if == 0 above #define AFTER_ON_F(a,b) ((a-b)==0) **EXPECTED!**
}
比较似乎涉及某种符号转换。我没有研究不同情况下的汇编代码,因为我认为这可以在代码级解决。
此处的上下文是一个名为“了解您的计时器类型”的博客说明:[blog]:http://www.teigfam.net/oyvind/home/technology/109-know-your-timers-type/
免责声明:这是一个私人博客,没有钱,广告,免费赠送给我或等等。我和任何人都没有点击这个网址或我的任何博客笔记中的任何网址。
在Go 中按预期工作,请参阅博客说明或http://play.golang.org/p/lH2SzZQEHG
它似乎在C ++中没有像预期的那样工作。