oververlow上的C unsigned char意外行为

时间:2016-04-26 15:24:11

标签: c

我正在研究一个传统的嵌入式项目,其中包含用于16位MCU的微芯片C30编译器。有一种预期的情况,索引从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!那么我错过了什么?这只是编译器相关的行为吗?

1 个答案:

答案 0 :(得分:7)

原因是整数促销

只要表达式中的int表示整数类型,类型就会提升为int

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

在第二种情况下,表达式应该是(unsigned char)( index +3 ),因为强制转换具有优先权,但编译器可能足够聪明,可以解决它。