做If判断,有时候经常会在括号里填入 a-b < 0 这样的判断, 这种情况下,非常容易出问题。
因为如果是两个无符号的u32数据相减,那结果不可能<0。 这样系统会报错。
这个情况非常隐蔽, 因为当我们用printf时候,这个问题不会存在,它会自动转换成有负号的值,
但在 if( ) 中这样, if( a-b <0) 就会出问题!
下面是例子:
uint32_t a=15645;
uint32_t b=52110;
int c;
SerialDmaPrintf("# 15645 - 52110 = %d \r\n " , 15645 - 52110); //输出 -36465
SerialDmaPrintf("# 15645 - 52110 = %d \r\n " ,a- b); //输出 -36465
if( (a- b) <0 ){ //错误 永远不<0
SerialDmaPrintf("# (a- b)<0!!!!! \r\n " );
}
if( a<b ){
SerialDmaPrintf("#a<b \r\n " );
}
c= a-b;
if(c<0){
SerialDmaPrintf("#c<0 \r\n ");
}
下面是对应的程序输出。可以看到 if( a-b <0) 没有被系统执行,这个条件不可能实现!
所以,一定要注意想当然的问题。 这个情况困扰了我很久。非常难以发现。