免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1561 | 回复: 6
打印 上一主题 下一主题

位运算的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-24 10:56 |只看该作者 |倒序浏览
比如下面这个小程序:

  1. #include <stdio.h>

  2. unsigned short calcc(unsigned short num){
  3.         unsigned short returnval;
  4.         unsigned short num1;
  5.         unsigned short num2;
  6.         num1=num>>8;
  7.         num2=((num&0x00c0)>>6)*256;
  8.         returnval=num1+num2;
  9.         return returnval;
  10. }


  11. int main()
  12. {
  13.         unsigned short num;
  14.         num=756;
  15.         num>>8;
  16.         printf("%d\n",num>>8);            /* 输出结果为2 */
  17.         printf("%d\n",((num&0x00c0)>>6)*256);                         /* 输出结果为768 */
  18.         printf("%d\n",num>>8+((num&0x00c0)>>6)*256);               /* 两个数相加,输出结果为2,为何? */
  19.         printf("%d\n",calcc(num));   /* 这样处理,可以输出正确结果  */
  20.         return 0;
  21. }
复制代码


768被谁吃了呢?
谢谢。

[ 本帖最后由 hohoxu_hao115 于 2007-5-24 10:58 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-05-24 11:03 |只看该作者
printf( "%d\n",num>>8+((num&0x00c0)>>6)*256);
加個括號不就行了
printf( "%d\n",(num>>8 ) +((num&0x00c0)>>6)*256);

论坛徽章:
0
3 [报告]
发表于 2007-05-24 11:09 |只看该作者
Operators                Associativity  
() [] -> .                   left to right
! ~ ++ -- + - *         (type) sizeof  right to left
* / %                       left to right
+ -                           left to right
<<  >>                    left to right
< <= > >=               left to right
== !=                      left to right
&                             left to right
^                            left to right
|                              left to right
&&                          left to right
||                            left to right
?:                           right to left
= += -= *= /= %= &= ^= |= <<= >>=  right to left
,                             left to right


优先级...顺序高-->低

论坛徽章:
0
4 [报告]
发表于 2007-05-24 11:11 |只看该作者
我知道了,是优先级的问题。谢谢楼上,楼上的楼上。
但是,num向右移776位怎么还是2呢?

[ 本帖最后由 hohoxu_hao115 于 2007-5-24 11:15 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-05-24 11:24 |只看该作者
不能吧??

怎么实现的?

论坛徽章:
0
6 [报告]
发表于 2007-05-24 11:32 |只看该作者
右移操作和使用的CPU上指令相关的...不知道标准怎么定义的.
intel CPU移位貌似是31位(有符号..无符号不知道)...所以可能对你位数取模了
gcc编译时候给警告了.

论坛徽章:
0
7 [报告]
发表于 2007-05-24 11:34 |只看该作者
楼上太高了,我试了一下,确实如此。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP