[应用方案] C语言处理32位unsigned long型数据 计算出错

[复制链接]
 楼主| ingramward 发表于 2024-8-21 04:46 | 显示全部楼层 |阅读模式
看了一些关于8位单片机对于32位数据处理的文章,8位机不像32能一次处理32位数据,即一次只能处理8位。结合这个现象想了想,有可能是这样的:


问题1的猜想:变量指定到xdata区时,在执行0x7FF-0x7D0的时候,已经执行了次低8位bit[15:8]的相减什么的,正要处理低8位bit[7:0],来中断了,中断中0x7FF变成了0x800,中断退出之后恢复,处理低8位时变成了0x00-0xD0=0xFFFFFF30,即最终的数值相减不是0x7FF-0x7D0而是0x700-0x7D0。

预想        实际
0x07FF - 0x07D0 = 0x2F        0x07FF 0x0700 - 0x07D0 = 0xFFFFFF30
32位内核一次性处理        8位内核将0x07FF-0x07D0拆分处理,先处理07-07,后处理FF-D0。但在处理这2字节的间隙,发生中断,FF变为00


问题2的猜想:data区的处理顺序貌似是反过来的,在执行0x7C6FF-0x7C3C8的时候,已经执行了低8位bit[7:0](0xFF-0xC8),正准备处理次低8位bit[15:8],来中断了,0x7C6FF变成了0x7C700,退出中断后继续处理bit[15:8]时变成了0xC7-0xC3,。即最终的数值相减不是0x7C6FF-0x7C3C8而是0x7C7FF-0x7C3C8=0x437。

预想        实际
0x7C6FF-0x7C3C8 = 0x337        0x7C6FF 0x7C7FF-0x7C3C8 = 0x437
32位内核一次性处理        8位内核将0x7C6FF-0x7C3C8拆分处理,先处理0xFF-0xC8,后处理C6-C3。但在这两者间隙,发生中断,C6变为C7




yangxiaor520 发表于 2024-8-21 07:59 来自手机 | 显示全部楼层
8位机处理效率要慢的多
呐咯密密 发表于 2024-8-26 13:46 | 显示全部楼层
所以现在32位大热啊
powerantone 发表于 2024-8-28 15:15 | 显示全部楼层
整数溢出
laocuo1142 发表于 2024-8-28 15:15 | 显示全部楼层
C语言中的运算符有不同的优先级。如果计算表达式中的运算符优先级使用不当,可能会导致计算顺序不是你预期的那样,从而得到错误的结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

1519

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

15

主题

1519

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部