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) 

猜你喜欢

转载自blog.csdn.net/zgcjaxj/article/details/105920062