[PIC32/SAM] pic单片机无符号整型比较大小异常的问题

[复制链接]
2509|17
 楼主| cr315 发表于 2024-12-10 10:53 | 显示全部楼层 |阅读模式
  我在用Pic 16f1825单片机开发程序的时候遇到个问题,两个全局变量,一个unsigend int (u16): tempu16,一个unsigned long(u32):tempu32, 串口打印u16的数值都是大于unsigned long的,但是发现
          if(tempu16 > tempu32)
                printf("judge 1\n");
          这个“judge1”的log有时候有,有时候没有,就是说判断条件有时候成立,有时候不成立。
后将tempu16的变量定义成u32的就不再有问题。
          使用的mplab ide的环境,picc9.8编译器.
          有哪位碰到过类似的问题吗?没法解释清楚啊!
laocuo1142 发表于 2024-12-10 10:59 | 显示全部楼层
用静态分析工具来检查潜在的错误和不一致之处。
玛尼玛尼哄 发表于 2024-12-13 11:07 | 显示全部楼层
先强制转换成一样的类型试试。
玛尼玛尼哄 发表于 2024-12-13 11:07 | 显示全部楼层
或者运行DEBUG,然后分部运行,观测变量。
gejigeji521 发表于 2024-12-15 14:09 来自手机 | 显示全部楼层
解决了没?是哪儿的问题?
dongnanxibei 发表于 2024-12-23 17:50 来自手机 | 显示全部楼层
你这两数字具体是什么值导致的失败,超界了吗?
呐咯密密 发表于 2024-12-24 10:51 | 显示全部楼层
是被编译器优化了吧
hight1light 发表于 2025-1-15 19:28 | 显示全部楼层
你遇到的问题是由于 数据类型不匹配 导致的隐式类型转换问题。
nqty 发表于 2025-1-15 20:34 | 显示全部楼层
在 C 语言中,当两个不同类型的变量进行比较时,编译器会进行隐式类型转换(也称为 类型提升),这可能会导致意外的结果。
hhdhy 发表于 2025-1-15 21:42 | 显示全部楼层
当你执行 if (tempu16 > tempu32) 时,编译器会将 tempu16 提升为 unsigned long(32 位),然后进行比较
teaccch 发表于 2025-1-15 22:50 | 显示全部楼层
由于 tempu16 是 16 位,而 tempu32 是 32 位,tempu16 的值范围是 0 到 65535,而 tempu32 的值范围是 0 到 4294967295。如果 tempu32 的值大于 65535,那么 tempu16 提升为 32 位后,仍然小于 tempu32,因此 if 条件不成立。如果 tempu32 的值小于或等于 65535,那么 tempu16 和 tempu32 的比较结果取决于它们的实际值
一切D都好 发表于 2025-1-16 08:29 | 显示全部楼层
当 tempu32 的值大于 65535 时,tempu16 提升为 32 位后仍然小于 tempu32,因此 if 条件不成立。当 tempu32 的值小于或等于 65535 时,tempu16 和 tempu32 的比较结果取决于它们的实际值,因此 if 条件有时成立,有时不成立。
yuliangren 发表于 2025-1-16 10:07 | 显示全部楼层
将 tempu16 的类型改为 unsigned long(32 位),这样两个变量的类型一致,比较时不会发生隐式类型转换。这是你提到的解决方案,确实可以避免问题
nuan11nuan 发表于 2025-1-16 13:02 | 显示全部楼层
如果你不想改变 tempu16 的类型,可以在较比时显式地将 tempu16 转换为 unsigned long这样可以确保比较时两个操作数的类型一致
ewyu 发表于 2025-1-16 14:09 | 显示全部楼层
问题是由于 unsigned int 和 unsigned long 的类型不匹配导致的隐式类型转换
gra22ce 发表于 2025-1-16 14:28 | 显示全部楼层
确保 tempu16 和 tempu32 的值范围符合预期。如果 tempu16 的值***不会超过 65535,而 tempu32 的值可能超过 65535,那么逻辑上 tempu16 应该始终小于 tempu32。
suiziq 发表于 2025-1-16 16:07 | 显示全部楼层
解决方案包括统一变量类型或显式类型转换。建议在编写代码时注意数据类型的一致性,避免隐式类型转换带来的问题
灰色与青 发表于 2025-9-20 15:54 | 显示全部楼层
PIC 单片机无符号整型比较异常,多因忽略无符号特性。当小值减大值时,结果不会为负,而是溢出为大正数。比如 0x0001 <0xFFFE,若用减法比较,会误判为大。应直接用关系运算符(<、>)比较,避免通过减法结果判断,防止溢出导致逻辑错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1466

主题

4964

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部