打印
[PIC32/SAM]

pic单片机无符号整型比较大小异常的问题

[复制链接]
1538|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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,然后分部运行,观测变量。

使用特权

评论回复
5
gejigeji521| | 2024-12-15 14:09 | 只看该作者
解决了没?是哪儿的问题?

使用特权

评论回复
6
dongnanxibei| | 2024-12-23 17:50 | 只看该作者
你这两数字具体是什么值导致的失败,超界了吗?

使用特权

评论回复
7
呐咯密密| | 2024-12-24 10:51 | 只看该作者
是被编译器优化了吧

使用特权

评论回复
8
hight1light| | 2025-1-15 19:28 | 只看该作者
你遇到的问题是由于 数据类型不匹配 导致的隐式类型转换问题。

使用特权

评论回复
9
nqty| | 2025-1-15 20:34 | 只看该作者
在 C 语言中,当两个不同类型的变量进行比较时,编译器会进行隐式类型转换(也称为 类型提升),这可能会导致意外的结果。

使用特权

评论回复
10
hhdhy| | 2025-1-15 21:42 | 只看该作者
当你执行 if (tempu16 > tempu32) 时,编译器会将 tempu16 提升为 unsigned long(32 位),然后进行比较

使用特权

评论回复
11
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 的比较结果取决于它们的实际值

使用特权

评论回复
12
一切D都好| | 2025-1-16 08:29 | 只看该作者
当 tempu32 的值大于 65535 时,tempu16 提升为 32 位后仍然小于 tempu32,因此 if 条件不成立。当 tempu32 的值小于或等于 65535 时,tempu16 和 tempu32 的比较结果取决于它们的实际值,因此 if 条件有时成立,有时不成立。

使用特权

评论回复
13
yuliangren| | 2025-1-16 10:07 | 只看该作者
将 tempu16 的类型改为 unsigned long(32 位),这样两个变量的类型一致,比较时不会发生隐式类型转换。这是你提到的解决方案,确实可以避免问题

使用特权

评论回复
14
nuan11nuan| | 2025-1-16 13:02 | 只看该作者
如果你不想改变 tempu16 的类型,可以在较比时显式地将 tempu16 转换为 unsigned long这样可以确保比较时两个操作数的类型一致

使用特权

评论回复
15
ewyu| | 2025-1-16 14:09 | 只看该作者
问题是由于 unsigned int 和 unsigned long 的类型不匹配导致的隐式类型转换

使用特权

评论回复
16
gra22ce| | 2025-1-16 14:28 | 只看该作者
确保 tempu16 和 tempu32 的值范围符合预期。如果 tempu16 的值***不会超过 65535,而 tempu32 的值可能超过 65535,那么逻辑上 tempu16 应该始终小于 tempu32。

使用特权

评论回复
17
suiziq| | 2025-1-16 16:07 | 只看该作者
解决方案包括统一变量类型或显式类型转换。建议在编写代码时注意数据类型的一致性,避免隐式类型转换带来的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1357

主题

3985

帖子

0

粉丝