我正在研究一个传统的嵌入式项目,该项目使用微芯片的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 )
,因为强制转换具有优先级,但也许编译器足够聪明,可以弄清楚它。