oververlow上的C unsigned char意外行为

前端之家收集整理的这篇文章主要介绍了oververlow上的C unsigned char意外行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找一个传统的嵌入式项目,其中包含用于16位MCU的微芯片C30编译器.有一种预期的情况,索引从0xFF回绕,我认为这是预定义的行为.然而,下面的代码总是把我抛弃//悲伤:(当我希望最终快乐的时候.
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 :(
}

它有效,我最终开心!那么我错过了什么?这只是编译器依赖的行为吗?

解决方法

原因是整数促销.

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

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

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

猜你在找的C&C++相关文章