C/C++中的逻辑右移和算术右移

逻辑左移和算术左移,都是在右边补0,效果一样。左移1bit,相当于原数 乘以2。

逻辑右移:右移后,左边补0

算术右移:右移后,左边补符号位,添加的位与原数的符号位相同,正数(0算作正数的一个)补0,负数补1。算术右移1bit,相当于原数 除以2。

C/C++中,对于无符号数,可以认为是逻辑左移和逻辑右移。对于有符号数,可以认为是算术左移和算术右移,

要对一个有符号数 执行逻辑右移,可以先将它强制类型转换为无符号类型。

要对一个无符号数 执行算术右移,可以先将它强制类型转换为有符号类型。

参考:https://blog.csdn.net/wait_nothing_alone/article/details/79516552

#include "stdio.h"
int main(int argc, char** argv)
{
    int a = 0xfffffffe; // -2
    int b = a >> 1;               //signed,   arithmetic shift right
    int c = (unsigned int)a >> 1; //unsigned, logic shift right
    printf(" b = 0x%x (%d) \n", b,b); // b = a /2 = -1
    printf(" c = 0x%x (%d) \n", c,c);

    unsigned int d = 0xfffffffe; // 
    unsigned int e = d >> 1;      //unsigned, logic shift right
    unsigned int f = (int)d >> 1; //signed,   arithmetic shift right
    printf(" e = 0x%x (%d) \n", e,e); 
    printf(" f = 0x%x (%d) \n", f,f);// f = d /2 = -1

    return 0;
}
 b = 0xffffffff (-1) 
 c = 0x7fffffff (2147483647) 
 e = 0x7fffffff (2147483647) 
 f = 0xffffffff (-1) 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123axj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值