第一次在c板块提问,一个关于位运算的问题,很奇怪,谁能帮忙解释一下,万分感谢!

ZQGet 2011-09-07 05:03:36
执行语句的意思是要读取一个int(4位)的数字
//arr是char的指针,off是int的偏移量
int i1=arr[off++] & 0xFF;
int i2=arr[off++] & 0xFF;
int i3=arr[off++] & 0xFF;
int i4=arr[off++] & 0xFF;

int i = (i1) +
(i2 << 8) +
(i3 << 16) +
(i4 << 24);

上面的语句就正确,但是下面这一句话 读取的结果就不对,不知道具体原因
int i = ((arr[off++] & 0xFF)) +
((arr[off++] & 0xFF) << 8) +
((arr[off++] & 0xFF) << 16) +
((arr[off++] & 0xFF) << 24);
...全文
146 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2011-09-07
  • 打赏
  • 举报
回复
都是偷懒惹的
ZQGet 2011-09-07
  • 打赏
  • 举报
回复
接着读整数的问题,下面又遇到了写整数的问题,读的时候
int i = ((arr[off++] & 0xFF)) +
((arr[off++] & 0xFF) << 8) +
((arr[off++] & 0xFF) << 16) +
((arr[off++] & 0xFF) << 24);

解释为因为一句话,所以off存在副作用,但是现在的写操作

void writeInt(char* arr, int off, int i)
{
arr[off] = (char) (i & 0x000000FF);
arr[off++] = (char) ((i & 0x0000FF00) >> 8);
arr[off++] = (char) ((i & 0x00FF0000) >> 16);
arr[off++] = (char) ((i & 0xFF000000) >> 24);
//下面的语句正确,上面的却错误
arr[off] = (char) (i & 0x000000FF);
arr[off+1] = (char) ((i & 0x0000FF00) >> 8);
arr[off+2] = (char) ((i & 0x00FF0000) >> 16);
arr[off+3] = (char) ((i & 0xFF000000) >> 24);
}

这个写操作是多个语句了,怎么还是有问题呢?(我的测试环境是 bcb6.0),请哪位朋友帮忙解释一下
至善者善之敌 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jackyjkchen 的回复:]
引用 7 楼 we_sky2008 的回复:

引用 6 楼 zqget 的回复:
思维定势了,我在java中大量使用了如下语句,没发生什么问题,现在移植到c++中 却发现了问题了
int i = ((arr[off++] &amp;amp; 0xFF)) +
((arr[off++] &amp;amp; 0xFF) << 8) +
((arr[off++] &……
[/Quote]

你看还是JAVA好!哈哈
ZQGet 2011-09-07
  • 打赏
  • 举报
回复
恩,就是,java给出的选择很单一,而c/c++给出的选择太多了,导致不同的编译器可能处理同样的问题的方式就不一样,艾,各有所长!

我在 做一个一个 手机游戏 用到的编辑器 (用的bcb),而提供的库又是java的,所以需要 在两者之间切换,所以才有了这一个问题,
我的网站,才刚刚开始建,还要多多向大家学习

www.lib9.net
十八道胡同 2011-09-07
  • 打赏
  • 举报
回复
int i = ((arr[off++] & 0xFF)) +
((arr[off++] & 0xFF) << 8) +
((arr[off++] & 0xFF) << 16) +
((arr[off++] & 0xFF) << 24);
会先计算off++呢?
we_sky2008 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jackyjkchen 的回复:]
引用 7 楼 we_sky2008 的回复:

引用 6 楼 zqget 的回复:
思维定势了,我在java中大量使用了如下语句,没发生什么问题,现在移植到c++中 却发现了问题了
int i = ((arr[off++] &amp;amp; 0xFF)) +
((arr[off++] &amp;amp; 0xFF) << 8) +
((arr[off++] &……
[/Quote]
呵呵,JAVA居然和C不一样
多谢!
jackyjkchen 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 we_sky2008 的回复:]

引用 6 楼 zqget 的回复:
思维定势了,我在java中大量使用了如下语句,没发生什么问题,现在移植到c++中 却发现了问题了
int i = ((arr[off++] &amp; 0xFF)) +
((arr[off++] &amp; 0xFF) << 8) +
((arr[off++] &amp; 0xFF) << 16) +
((arr[off++]……
[/Quote]

java的顺序定死的
ZQGet 2011-09-07
  • 打赏
  • 举报
回复
确实不会出问题,我确认,经过反复验证过的
we_sky2008 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zqget 的回复:]
思维定势了,我在java中大量使用了如下语句,没发生什么问题,现在移植到c++中 却发现了问题了
int i = ((arr[off++] & 0xFF)) +
((arr[off++] & 0xFF) << 8) +
((arr[off++] & 0xFF) << 16) +
((arr[off++] & 0xFF) << 24);
[/Quote]
JAVA中这样用不会出问题吗?
ZQGet 2011-09-07
  • 打赏
  • 举报
回复
思维定势了,我在java中大量使用了如下语句,没发生什么问题,现在移植到c++中 却发现了问题了
int i = ((arr[off++] & 0xFF)) +
((arr[off++] & 0xFF) << 8) +
((arr[off++] & 0xFF) << 16) +
((arr[off++] & 0xFF) << 24);
ZQGet 2011-09-07
  • 打赏
  • 举报
回复
谢谢指教,明白了,结果我使用的编译器 bc++,从右边计划 off的值了,导致结果和我想象的不一样!
jackyjkchen 2011-09-07
  • 打赏
  • 举报
回复
楼主这个和月经贴i++++i是一样的道理,你搞不清楚谁先计算
jackyjkchen 2011-09-07
  • 打赏
  • 举报
回复
#define LOAD32L(x, y) \
{ x = ((ulong32)((y)[3] & 255)<<24) | \
((ulong32)((y)[2] & 255)<<16) | \
((ulong32)((y)[1] & 255)<<8) | \
((ulong32)((y)[0] & 255)); }


我这里的算法库有个类似的宏,就是一步完成,参考一下吧

we_sky2008 2011-09-07
  • 打赏
  • 举报
回复

int i = ((arr[off] & 0xFF)) +
((arr[off + 1] & 0xFF) << 8) +
((arr[off + 2] & 0xFF) << 16) +
((arr[off + 3] & 0xFF) << 24);

这个就没问题,这样就不会存在求值副作用
we_sky2008 2011-09-07
  • 打赏
  • 举报
回复
求值顺序不确定,会产生副作用
int i = ((arr[off++] & 0xFF)) +
((arr[off++] & 0xFF) << 8) +
((arr[off++] & 0xFF) << 16) +
((arr[off++] & 0xFF) << 24);
你说会先计算那个off++呢?

google 求值序列点
内容概要:本文档围绕“风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真”展开,系统介绍了采用虚拟同步发电机(VSG)控制策略的风电与储能联合并网系统的建模与仿真方法。通过Simulink平台构建完整的电力系统动态模型,重点实现VSG的关键控制逻辑,以提升新能源并网的稳定性、惯性响应与频率支撑能力。文档不仅涵盖核心仿真模型,还整合了大量相关前沿研究内容,如混合储能调频、微电网优化、电动汽车可调能力评估、智能算法在电力系统中的应用等,并提供丰富的Matlab/Simulink代码实例,具有较强的科研复现价值和技术参考意义。; 适合人群:具备电力系统基础理论知识和Matlab/Simulink仿真能力的研究生、科研人员及从事新能源发电、储能控制、智能电网等领域工作的工程技术人员;特别适用于正在开展风储协同控制、虚拟同步机、构网型变流器等相关课题研究的高校师生。; 使用场景及目标:① 深入理解虚拟同步发电机(VSG)在风储并网系统中的控制原理与技术优势;② 借助提供的仿真模型与代码完成科研论文复现、算法验证与系统性能测试;③ 探索新能源高渗透背景下提升电网稳定性的关键技术路径,包括惯量模拟、一次频率响应、储能协同控制等。; 阅读建议:建议读者按照文档结构循序渐进地学习,优先下载并运行配套的Simulink模型与Matlab代码,结合VSG控制策略的设计细节进行调试与分析,同时可关注公众号“荔枝科研社”获取完整资源包及持续的技术支持,以提升科研效率与创新能力。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧