使用GCC进行签名的字符溢出处理

时间:2015-09-06 20:08:39

标签: c++ c gcc go integer-overflow

以下示例不能像我预期的那样(在条件中使用“>”)在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 ++中没有像预期的那样工作。

0 个答案:

没有答案