“-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.
所以写代码还是要仔细.
在这里插入图片描述

你可能感兴趣的:(笔记,keil,mdk,extern,数据类型,单片机,c#)