帮忙看看这几行代码有什么问题,谢谢

[复制链接]
3515|8
 楼主| tianxiongweitxw 发表于 2021-6-10 19:43 | 显示全部楼层 |阅读模式
      帮忙看看这几行代码有什么问题,谢谢。字节数据能移动24位在与一个32位的变量逻辑与操作吗?   
SpiWriteAddr=((BYTE)IapReadByte(Spiaddress))<<24| SpiWriteAddr;
                   SpiWriteAddr=((BYTE)IapReadByte(Spiaddress+1))<<16| SpiWriteAddr;
                   SpiWriteAddr=(BYTE)IapReadByte(Spiaddress+2)<<8| SpiWriteAddr;
                   SpiWriteAddr=((BYTE)IapReadByte(Spiaddress+3))| SpiWriteAddr;
LcwSwust 发表于 2021-6-10 20:03 | 显示全部楼层
 楼主| tianxiongweitxw 发表于 2021-6-10 21:17 | 显示全部楼层
强制转换成LONG了
 楼主| tianxiongweitxw 发表于 2021-6-10 21:44 | 显示全部楼层
我在想,系统会不会自动转成LONG再操作
xyz549040622 发表于 2021-6-10 22:53 | 显示全部楼层
1.我建议多加括号,不要用强制优先级
2.建议进行仿真跟踪就知道了
3.我觉得是可以的吧,但是要具体看仿真结果
QuakeGod 发表于 2021-6-11 00:04 | 显示全部楼层
那个运算符是 “或” 操作, 不是 “与”。

另外,为啥用这么笨的方法呢? 字节是最小访问单位。
直接定义一个联合体就行了。

union myunion{
int32 SpiWriteAddr;
BYTE bytes[4];
}u1;
u1.bytes[3]=(BYTE)IapReadByte(Spiaddress);
u1.bytes[2]=(BYTE)IapReadByte(Spiaddress+1);
u1.bytes[1]=(BYTE)IapReadByte(Spiaddress+2);
u1.bytes[0]=(BYTE)IapReadByte(Spiaddress+3);

然后 u1.SpiWriteAddr 变量里面就是正确的值了。

如果不想用联合体,就用指针。
((BYTE *)(&SpiWriteAddr))[3]=IapReadByte(Spiaddress);
((BYTE *)(&SpiWriteAddr))[2]=IapReadByte(Spiaddress+1);
((BYTE *)(&SpiWriteAddr))[1]=IapReadByte(Spiaddress+2);
((BYTE *)(&SpiWriteAddr))[2]=IapReadByte(Spiaddress+3);
效果是一样的。
本来就是简单的数据转移操作,真的用不着 与或非 啥的运算。
只有 操作的数据小于 最小单位(字节)的时候,没办法,才用与或非 勉强代替。

评论

用结构体,Spiaddress是高字节,Spiaddress+3是低字节,你这样处理的结果好像是反了。不过方法很好,谢谢指教。  发表于 2021-6-11 21:59
ayb_ice 发表于 2021-6-11 09:11 | 显示全部楼层
先强制转换成32位再移动,再与其它操作
dlutccj 发表于 2021-6-15 08:55 | 显示全部楼层
6楼正解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

521

帖子

0

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