位运算

    先看下面一段代码:
#include <stdio.h>

int main(int argc , char *argv[])
{
	unsigned short int i = 0 ;
	unsigned char ii = 255 ;
	int j = 8,p,q ;

	p = j << 1 ;
	q = j >> 1 ;
	i = i - 1 ;
	ii = ii + 1 ;

	printf("i = %d\n",i) ;
	printf("ii = %d\n",ii) ;
	printf("p = %d\n",p) ;
	printf("q = %d\n",q) ;

	return 0 ;
}

      上述代码中,变量i是一个unsigned short int类型,在32位平台下大小是2个字节,因此其无符号类型的大小范围为0~65535,。i赋值之后为0,内存中的数据为0x0000,。当执行了i = i - 1 ;之后,内存中的数据变为0xffff,所以结果就是65535。

      变量ii是一个unsigned short char类型,大小是1个字节,因此其无符号类型的大小范围为0~255,。ii赋值之后为255,内存中的数据为0xff。当执行了ii = ii + 1 ;之后,内存中的数据变为0x00,所以结果就是0.

      左移操作<<相当于乘法操作,>>n相当于乘以2^n。右移操作相当于除法操作,>>n相当于除以2^n。因此,对与变量p和q的输出分别是16和4.

      通过以上分析可以看出,对于无符号结果的问题,我们需要十分清楚数据在内存中的大小以及其表达形式。另外,我们需要知道移位操作是最有效率的(可以代替乘除法),因此在嵌入式系统编程或者其他许多需要高效率的地方能够得到运用。

下面是程序运行出的结果:

1 i = 65535 

2 ii = 0

3 p = 16

4 q = 4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值