打印
[应用方案]

C语言处理32位unsigned long型数据 计算出错

[复制链接]
1173|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
整数溢出

使用特权

评论回复
5
laocuo1142| | 2024-8-28 15:15 | 只看该作者
C语言中的运算符有不同的优先级。如果计算表达式中的运算符优先级使用不当,可能会导致计算顺序不是你预期的那样,从而得到错误的结果。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

1204

帖子

0

粉丝