C 溢出上的无符号字符意外行为



我正在研究一个传统的嵌入式项目,该项目使用微芯片的C30编译器用于16位MCU。 有一种预期的情况是索引从我认为是预定义行为的0xFF中环绕。 但是,当我希望最终获得快乐时,以下代码总是将我转储//sad :(

unsigned char index = 0xFF;
unsigned char check = 0x02;
if(check == index +3){
    //happy!
}else{
    //sad :(
}

现在,如果我专门将其投射到unsigned char

unsigned char index = 0xFF;
unsigned char check = 0x02;
if(check == (unsigned char) index +3){
    //happy!
}else{
    //sad :(
}

它有效,我最终陷入了//happy! 那么我错过了什么?这只是依赖于编译器的行为吗?

原因是整数促销

只要整数类型可以用表达式中的int表示,则该类型将提升为 int

在第一种情况下,index被提升为int类型,然后发生加法,你得到值258,它不等于2。

在第二种情况下,表达式应该(unsigned char)( index +3 ),因为强制转换具有优先级,但也许编译器足够聪明,可以弄清楚它。

最新更新