矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2624|回复: 4

耕码多年终于遇上一次坑了

[复制链接]
     
发表于 2021-9-7 21:21:59 | 显示全部楼层 |阅读模式
        耕码多年第一次遇上这种情况,代码在 keil5 MDK arm 上编译为汇编时,把有符号的除法翻译成了无符号除法,在操作数都是正数时,工作正常,一但遇到负数,就懵逼了。
        遇到代码问题汇编还是要看下的,毕竟中间商要赚差价。
        不知道前些年的 扑街 车(电动独轮车)是不是也是用的这个算法和编译器,在车子检测到超出设定时速时,系统突然有负的加速度,于是根据出错的代码运行,结果速度突然就变成 0 静止了,于是完美的产生了一个扑街。

arm汇编无符号除法说明

arm汇编无符号除法说明

强制转为long类型

强制转为long类型

强制转为signed long 类型

强制转为signed long 类型

手动转换为正数计算

手动转换为正数计算

评分

2

查看全部评分

     
发表于 2021-9-7 23:53:23 | 显示全部楼层
-1转成补码参与运算溢出了?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-9-8 08:48:42 | 显示全部楼层
yangsen 发表于 2021-9-7 23:53
-1转成补码参与运算溢出了?

不,是编译器压根就不认负数,所有数的运算都用同一个无符号除法指令,在c代码里强制成为有符号运算也没用,最后只好把负数也变成正数才运算正常。
回复 支持 反对

使用道具 举报

     
发表于 2021-9-8 09:12:51 来自手机 | 显示全部楼层
本帖最后由 iffi123 于 2021-9-8 09:15 编辑

mdk不应该会出现这种错误 应该是编译器的理解和你不同 比如赋值语句左边是无符号数 编译器可能把右边全部当成无符号数处理 而不是一部分当成符号数运算  当然我是猜的
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-9-9 08:32:08 | 显示全部楼层
iffi123 发表于 2021-9-8 09:12
mdk不应该会出现这种错误 应该是编译器的理解和你不同 比如赋值语句左边是无符号数 编译器可能把右边全部当 ...

你说得对
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 07:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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