加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oververlow上的C unsigned char意外行为

发布时间:2020-12-16 03:43:53 所属栏目:百科 来源:网络整理
导读:我正在寻找一个传统的嵌入式项目,其中包含用于16位MCU的微芯片C30编译器.有一种预期的情况,索引从0xFF回绕,我认为这是预定义的行为.然而,下面的代码总是把我抛弃//悲伤:(当我希望最终快乐的时候. unsigned char index = 0xFF;unsigned char check = 0x02;if(
我正在寻找一个传统的嵌入式项目,其中包含用于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),因为强制转换具有优先权,但编译器可能足够聪明,可以解决它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读