打印

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

[复制链接]
2931|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再操作

使用特权

评论回复
5
xyz549040622| | 2021-6-10 22:53 | 只看该作者
1.我建议多加括号,不要用强制优先级
2.建议进行仿真跟踪就知道了
3.我觉得是可以的吧,但是要具体看仿真结果

使用特权

评论回复
6
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);
效果是一样的。
本来就是简单的数据转移操作,真的用不着 与或非 啥的运算。
只有 操作的数据小于 最小单位(字节)的时候,没办法,才用与或非 勉强代替。

使用特权

评论回复
评论
tianxiongweitxw 2021-6-11 21:59 回复TA
用结构体,Spiaddress是高字节,Spiaddress+3是低字节,你这样处理的结果好像是反了。不过方法很好,谢谢指教。 
7
ayb_ice| | 2021-6-11 09:11 | 只看该作者
先强制转换成32位再移动,再与其它操作

使用特权

评论回复
8
dlutccj| | 2021-6-15 08:55 | 只看该作者
6楼正解

使用特权

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

本版积分规则

72

主题

520

帖子

0

粉丝