ericxia 发表于 2018-6-7 15:57:19

STM8S103乘法错误

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。为什么?

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

使用强制类型转换看看

wenyangzeng 发表于 2018-6-7 16:28:35

x和y也定义成uint16_t

lvwy0704 发表于 2018-6-7 16:35:35

有截图不?

stm1024 发表于 2018-6-7 17:31:00

你把x,y其中至少一个定义为uint16_t
或者修改代码:
pp=x;
pp*=y;
运行效果截图我再看看?

toofree 发表于 2018-6-8 00:41:51

本帖最后由 toofree 于 2018-6-8 00:43 编辑

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






把后面使用的代码注释掉,整个乘法就被优化没了



toofree 发表于 2018-6-8 00:51:27

那么,可不可以不让优化呢,方法也是有的,加 volatile 修饰。





toofree 发表于 2018-6-8 00:55:51

不拿板子试,真不知道什么问题。楼主不给工程,只给个部分代码,有问题,全靠猜。

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

7、8楼最佳答案

feixiang20 发表于 2018-6-8 00:58:46

看看你的转换类型,换个参数重新测试关联,看看STM8S103x 数据手册8位乘8位的乘法指令等等的用法。类似的问题有如下回答,这是因为做乘法运算时,编译器实际上调用了一个函数,而这个函数用到了几个编译器自定义的全局变量,如果不按照2楼说的去做,在进入中断时不会保存这几个全局变量,而造成这个乘法运算函数为不可重入,导致错误。
页: [1] 2
查看完整版本: STM8S103乘法错误