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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版