奇怪的与负数比较问题

Gauchy 2010-05-12 09:09:40
在程序开发过程中发现一个问题,我定义了一个常量,是负数:
#define SENSOR_VAL_INVALID -100
用于表示获取的温度传感器值是无效的。
做测试如下:
int8_t n = 49;
int8_t temp = SENSOR_VAL_INVALID;
if (n < temp)
{
n = 0;
}

如果n是负数,则能正确比较是小于temp的。如果n是正数,则判断错误,执行了n=0语句。
有没有高人解释一下?其中int8_t是signed char类型。
...全文
116 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gelu1040 2010-05-13
  • 打赏
  • 举报
回复

int8_t 的定义代码存在问题
Peasant_Lee 2010-05-13
  • 打赏
  • 举报
回复
个人感觉到很奇怪,是不是编译的问题?到VC下试试结果如何,,,,
Gauchy 2010-05-13
  • 打赏
  • 举报
回复
刚才继续调试了一下,发现就算如此定义,也是错误:
int8_t n = -100;

int8_t temp = 49;

if (temp < n)
{
return;
}
也执行到了return。难道与函数有关系?
Gauchy 2010-05-13
  • 打赏
  • 举报
回复
如果n取大于-100的负数时,结果也是对的,也就是只要n小于0,就能正确比较结果。在大于0的数时就出现错误判断,我怀疑是将SENSOR_VAL_INVALID当成正数来判断了,可是就算显式将SENSOR_VAL_INVALID转换为int8_t也会有问题。
对了用的是ST7的芯片,STVD4.1.5开发环境,COSMIC编译工具。
Gauchy 2010-05-13
  • 打赏
  • 举报
回复
谢谢楼上的回复,这些办法我都试过了。包括添加(int8_t),包括不使用temp变量,直接比较,也包括在SENSOR_VAL_INVALID前面加上(int8_t)都是这样,我的数定义的是-100,根本不到(int8_t)的下限啊,何况负数比较的时候是没有问题的,只有在正数与-100比较时会结果有问题。我用的是STVD4.1.5版本。
galle 2010-05-13
  • 打赏
  • 举报
回复
不用temp直接比较结果怎么样?
为什么要用temp赋值一次~!
Gauchy 2010-05-13
  • 打赏
  • 举报
回复
int8_t 的定义代码怎么会有问题?
就是
#define int8_t signed char而已
目前猜测可能是COSMIC编译器有关。在自己的条件上添加了变量是否小于0的判断与上之前的条件,临时对付一下。等项目作为,好好分析分析。希望有知道的高手能指点一二。谢谢!
guoyu_bo 2010-05-13
  • 打赏
  • 举报
回复
单步调试看看
宇帆 2010-05-13
  • 打赏
  • 举报
回复
程序没有问题啊,很神奇,难道是编译器问题,或者int8_t定义有问题?
jbb0523 2010-05-12
  • 打赏
  • 举报
回复
首先你注意signed char的范转是-128到127,
估计是按补码计算了吧。。。。
捕鲸叉 2010-05-12
  • 打赏
  • 举报
回复
#define SENSOR_VAL_INVALID (int8_t)(-100)

试试

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧