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),因为强制转换具有优先权,但编译器可能足够聪明,可以解决它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |