你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S103乘法错误

[复制链接]
ericxia 提问时间:2018-6-7 15:57 /
ST Visual Develop + Cosmic 4.2.4 + STM8S003,
如下代码:

uint8_t x;
uint8_t y;
uint16_t pp;

x = 100;
y = 22;
pp = x * y;

最后pp的结果为500。为什么?
收藏 评论10 发布时间:2018-6-7 15:57

举报

10个回答
ericxia 回答时间:2018-6-7 16:09:10
uint8_t x, y,z;
uint16_t pp;

x = 100;
y = 22;
z = 1;

pp = (x * y ) / z;

结果会是多少呢?调试发现结果是200,这是为什么?

wudianjun2001 回答时间:2018-6-7 16:20:51
使用强制类型转换看看

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-6-7 16:28:35
x和y也定义成uint16_t

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

lvwy0704 回答时间:2018-6-7 16:35:35
有截图不?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

STM1024 回答时间:2018-6-7 17:31:00
你把x,y其中至少一个定义为uint16_t
或者修改代码:
pp=x;
pp*=y;
运行效果截图我再看看?

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

七哥 回答时间:2018-6-8 00:41:51
本帖最后由 toofree 于 2018-6-8 00:43 编辑

一切正常。你有可能是上面运算了,但是下面程序中没有使用,导致优化掉了,根本就没这代码。
一切以汇编为准,汇编没有的,那就是没有。
傲游截图20180608003634.jpg

傲游截图20180608003843.jpg

傲游截图20180608003936.jpg

把后面使用的代码注释掉,整个乘法就被优化没了
傲游截图20180608004324.jpg


评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

七哥 回答时间:2018-6-8 00:51:27
那么,可不可以不让优化呢,方法也是有的,加 volatile 修饰。

傲游截图20180608005158.jpg

傲游截图20180608005328.jpg

七哥 回答时间:2018-6-8 00:55:51
不拿板子试,真不知道什么问题。楼主不给工程,只给个部分代码,有问题,全靠猜。

猜到你后面没有使用 pp 变量!

7、8楼最佳答案
feixiang20 回答时间:2018-6-8 00:58:46
看看你的转换类型,换个参数重新测试关联,看看STM8S103x 数据手册8位乘8位的乘法指令等等的用法。类似的问题有如下回答,这是因为做乘法运算时,编译器实际上调用了一个函数,而这个函数用到了几个编译器自定义的全局变量,如果不按照2楼说的去做,在进入中断时不会保存这几个全局变量,而造成这个乘法运算函数为不可重入,导致错误。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

STM1024 回答时间:2018-6-9 15:34:00
toofree 发表于 2018-6-8 00:55
不拿板子试,真不知道什么问题。楼主不给工程,只给个部分代码,有问题,全靠猜。

猜到你后面没有使用 pp  ...

提问不留下代码的人木有小鸡鸡。
为了解答这种问题,也真是难为你了。
在给出解决方案前,还得先猜测一下出问题的场景。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版