c语言中的移位

学过c语言的朋友一定知道移位运算:>>右移,<<左移,把一个位表示的操作数以小数点位置为参照左右移动。>>右移k位,则丢弃最低的k为,左移k位最低的k位补0。
例如:
11111111 >> 4 = 00001111
11111111 << 4 = 111111110000
刚刚学习完c语言我也是这样理解的,前段时间看了《深入理解计算机系统》中,才看到逻辑右移和算术右移的分别,真是年少无知啊!!!

有一个相应的右移运算x>>k,按照我之前的理解是直接丢弃低k位,高位补0,但是,一般而言,机器是支持两种形式的右移:逻辑右移算术右移

简单来说,逻辑右移是在左端补0,而算术右移是在左端补最高位的有效值
参数 x = [01100011]时:
x<<4  =   [00110000]
x>>4(逻辑右移) = [00000110]
x>>4(算术右移) = [00000110]

x = [10010101]时:
x>>4(逻辑右移) = [00001001]
x>>4(算术右移) = [11111001]

c语言中对于无符号数据(unsigned),右移必须是逻辑的,对于有符号数,理论上都可以,但是 几乎所有的编译器/机器组合都对有符号数使用算术右移,所以程序员也一般默认使用算术右移。

java中对于如何右移有明确定义:
x>>k    算术右移k个位置
x>>>k 逻辑右移k个位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值