“-1>0”? 编译器出错了? extern与“整形提升”

在这里插入图片描述

原来是昨天,在Keil5中写代码时遇到这样一个问题
上代码:

if((-LW_Parameter)>tim)
			{//反转
			L_emoter_back();
			}

其中LW_Parameter为int8_t类型的变量,仿真查看其值为0x01.
(-LW_Parameter)为-1.
tim是在main函数中定义的全局变量,int类型,仿真查看其值为0x00.
if语句判断为真,-1大于0了!

原因是:
由于我的大意,在这段代码的.c文件的外部声明中写成了这样

  extern uint8_t tim;
  tim=0;

由于Keil5编译器设置:extern这个关键字没有找到外部声明的变量,编译器也不会报错,且程序运行良好,但不保证使用其它编译器也如此。

所以这里extern在没有找到uint8_t类型的tim变量的情况下,又定义了一个uint8_t类型的tim变量!

看到这里可能大家已经看出来出现了什么问题,那就是发生了“整形提升”(在表达式计算时,如果表达式的整型类型不同,首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。)
然而在Keil5中整形数据会被直接提升为unsigned int类型,所以-1的补码为11111111111111111111111111111111,其值为4294967295!
所以if比较的并不是-1是否大于0,而是4294967295是否大于1.
所以写代码还是要仔细.
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值