我正在研究一个传统的嵌入式项目,其中包含用于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!
那么我错过了什么?这只是编译器相关的行为吗?
答案 0 :(得分:7)
原因是整数促销。
只要表达式中的int
表示整数类型,类型就会提升为int
。
在第一种情况下,index
被提升为int类型,然后添加,你得到值258,它不等于2.
在第二种情况下,表达式应该是(unsigned char)( index +3 )
,因为强制转换具有优先权,但编译器可能足够聪明,可以解决它。