Chinaunix首页 | 论坛 | 博客
  • 博客访问: 652238
  • 博文数量: 99
  • 博客积分: 4335
  • 博客等级: 中校
  • 技术积分: 931
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-26 14:11
文章分类

全部博文(99)

文章存档

2012年(14)

2011年(17)

2010年(14)

2009年(54)

分类: C/C++

2009-07-27 19:41:38

c语言位操作的一些注意事项

1. 位操作尽量使用unsigned char,而不是char,否则会使你混乱

如果你使用char,那么一个普通的字符,0xe3,因为首位是1,所以当他被转换为16位长时,成了0xffffffe3,而不是我们想要的0x000000e3,因为他是一个有符号的负数。
举例如下:
#include
#include

int main()
{
//    char buf[10] = {0};
    unsigned char buf[10] = {0};
    char sbuf[10] = {0};
    buf[0] = 0xe3;
    buf[1] = 0xb4;
    sbuf[0] = 0xe3;
    sbuf[1] = 0xb4;
    unsigned short pid1, pid2, pid3;
   
/*bit operations with unsigned chars*/
    printf("bit operations with unsigned chars:\n");
    pid1= (buf[0]&0x1f);
    pid2= ((buf[0]&0x1f)<<8);
    pid3= ((buf[0]&0x1f)<<8)|buf[1];
   

    printf( "pid1 = %x\n", pid1  );
    printf( "pid2 = %2x\n", pid2  );
    printf( "pid3 = %2x\n", pid3  );


/*bit operations with signed chars*/
    printf("bit operations with signed chars:\n");
    pid1= (sbuf[0]&0x1f);
    pid2= ((sbuf[0]&0x1f)<<8);
    pid3= ((sbuf[0]&0x1f)<<8)|sbuf[1];
   

    printf( "pid1 = %x\n", pid1  );
    printf( "pid2 = %2x\n", pid2  );
    printf( "pid3 = %2x\n", pid3  );

}

结果如下:
[shaoting@serverbj6:/user/shaoting/DVB-T]$ ./a.out
bit operations with unsigned chars:
pid1 = 3
pid2 = 300
pid3 = 3b4
bit operations with signed chars:
pid1 = 3
pid2 = 300
pid3 = ffb4

可见,pid3的两次取值,因为一个是针对unsigned char的buffer,另一个是针对char的buffer而使结果不同。


2. 每次操作最好用括号括起来,不要随意猜想其算术优先级
位操作的优先级比算数运算优先级低,如果记不清楚,就将其括起来,不要想当然,例子:

#include
#include

int main()
{
    unsigned char buf[10] = {0};
    buf[0] = 0xf0;
    buf[1] = 0x03;
    unsigned short pid3, pid4;
   
    pid3= 5+ ((buf[0]&0x0f)<<8)|buf[1];
    pid4 =5+ (((buf[0]&0x0f)<<8)|buf[1]);

   

    printf( "pid3 = %2x\n", pid3  );
    printf( "pid4 = %2x\n", pid4  );
   
}

结果:
[shaoting@serverbj6:/user/shaoting/DVB-T]$ ./a.out
pid3 =  7
pid4 =  8

可见,我们以为pid3和pid4结果应该是一样的,都是8,但我们错了,pid3的计算结果其实是等于
(5+ ((buf[0]&0x0f)<<8))|buf[1],即先进行了加法计算,在进行了位与计算。

阅读(880) | 评论(0) | 转发(0) |
0

上一篇:C 中的几个关键字

下一篇:GCC精彩之旅

给主人留下些什么吧!~~