第一次在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);
...全文
100 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 求值序列点

69,364

社区成员

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

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