一、前言
在程序编写的时候我们经常遇到类似语句
if((a-b) > 0)
{
.........
}
else
{
.........
}
但是a-b一定就是我们的预期值吗,当定义uint8_t a = 876; uint8_t b = 879;两个无符号的整数相减,结果是正数还是负数,今天我们测试一下
二、测试
测试MCU,32位MCU,其他的8位或者16位未测试
(1)定义uin8_t
int main()
{
uint8_t a = 876;
uint8_t b = 879;
uint8_t c = a-b;
printf("a-b = %d,c:%d\r\n",a-b,c);
if((a-b) > 0)
{
printf("a-b > 0\r\n");
}
else
{
printf("a-b < 0\r\n");
}
if(c > 0)
{
printf("c > 0\r\n");
}
else
{
printf("c < 0\r\n");
}
}
运行结果:
(2)定义为uint16_t
int main()
{
uint16_t a = 876;
uint16_t b = 879;
uint16_t c = a-b;
printf("a-b = %d,c:%d\r\n",a-b,c);
if((a-b) > 0)
{
printf("a-b > 0\r\n");
}
else
{
printf("a-b < 0\r\n");
}
if(c > 0)
{
printf("c > 0\r\n");
}
else
{
printf("c < 0\r\n");
}
}
运行结果
(3)uint32_t
int main()
{
uint32_t a = 876;
uint32_t b = 879;
uint32_t c = a-b;
if((a-b) > 0)
{
printf("a-b > 0\r\n");
}
else
{
printf("a-b < 0\r\n");
}
if(c > 0)
{
printf("c > 0\r\n");
}
else
{
printf("c < 0\r\n");
}
}
运行结果:
(3)unsigned int
int main()
{
unsigned int a = 876;
unsigned int b = 879;
unsigned int c = a-b;
if((a-b) > 0)
{
printf("a-b > 0\r\n");
}
else
{
printf("a-b < 0\r\n");
}
if(c > 0)
{
printf("c > 0\r\n");
}
else
{
printf("c < 0\r\n");
}
}
运行结果:
三、结论
测试可见,在32位MCU中,变量a和b定义的类型不一样结果也会不同。在实际做减法判断时最好将其赋值给变量c,然后再做判断,防止出现异常。在一些SDK中已经发现类似错误,在这提醒大家要格外注意。