找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2251|回复: 7
收起左侧

Keil调试功能有BUG?

[复制链接]
ID:694871 发表于 2020-6-15 19:28 | 显示全部楼层 |阅读模式
本帖最后由 星水天河 于 2020-6-15 19:29 编辑

例如执行i=0xA2FC%10;得到的是0x04。这个结果是正确的。(0xA2FC=41724)
但是语句remainder=quotient%10;(quotient变量当前的值为0xA2FC,为int型变量;remainder为unsigned char型变量)
执行后,在Watch窗口看到的remainder的值为0xFE? (这个问号是Watch窗口中remainder变量的值这一栏中就有的)
即便我进行强制类型转换remainder=(unsigned char)quotient%10;得到的结果为0x02,也和0x04的正确结果完全不符合。这是怎么回事?
图片3.jpg
图片1.jpg
回复

使用道具 举报

ID:592807 发表于 2020-6-16 08:47 | 显示全部楼层
remainder=(unsigned char)(quotient%10)
回复

使用道具 举报

ID:694871 发表于 2020-6-16 12:27 | 显示全部楼层
黄youhui 发表于 2020-6-16 08:47
remainder=(unsigned char)(quotient%10)

改成这样之后在Watch窗口看到的remainder的值还是0xFE'?  请问这是怎么回事。。
回复

使用道具 举报

ID:267719 发表于 2020-6-16 13:41 | 显示全部楼层
i是unsigned int =0xA2FC=41724    i%10的结果也是和i类型一样  所以是4
quotient是int =0xA2FC=-23812 所以%10后得到的是-2  FFFE(quotient%10的结果也是和quotient的类型一样是int型),然后赋值给unsigned char型的remainder,那remainder=0xFE
remainder=(unsigned char)quotient%10的话,quotient=0xA2FC;(unsigned char)quotient=0xFC;
0xFC%10=252%10=2.
所以正确做法应该这样:
remainder=(unsigned int)quotient%10;
先把quotient强制转换成unsigned int型,这时quotient%10的结果也是unsigned int型。得到0x0004,再赋值给remainder就是0x04
回复

使用道具 举报

ID:592807 发表于 2020-6-16 13:46 | 显示全部楼层
星水天河 发表于 2020-6-16 12:27
改成这样之后在Watch窗口看到的remainder的值还是0xFE'?  请问这是怎么回事。。

单步执行看看吧,我这没问题
2.png
回复

使用道具 举报

ID:123289 发表于 2020-6-16 15:19 | 显示全部楼层
INT 的最大值是多少?
有负的INT吗?
回复

使用道具 举报

ID:782419 发表于 2020-6-17 21:43 | 显示全部楼层
remainder=(unsigned char)quotient%10
quotient=0xA2FC=41724
(unsigned char)quotient=0xFC,这没有什么问题吧
0xFC=252,这也没有问题吧
那么252对10取余等于2有什么问题么?
回复

使用道具 举报

ID:694871 发表于 2020-6-21 07:13 | 显示全部楼层
carpcarey 发表于 2020-6-16 13:41
i是unsigned int =0xA2FC=41724    i%10的结果也是和i类型一样  所以是4
quotient是int =0xA2FC=-23812 所 ...

你的回答是对的。感谢!还有一个问题是上面的截图里remainder=0XFE‘?这个'?是什么意思?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表