C语言的左移和右移



在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变


左移:

             当左移的位数不超过该数值类型的最大位数时:逻辑左移(补0,丢弃最高位)

当左移的位数超过该数值类型的最大位数时:编译器会用左移的位数去模类型的最大位数,然后按余数进行移位(只是执行:左移 所得的余数 个位数)

int i = 1, j = 0x80000000; //设int为32位
i = i << 33;   // 33 % 32 = 1   只左移1位,i变成2
j = j << 33;   // 33 % 32 = 1   只左移1位,j变成0,最高位1被丢弃

右移:>>

              算术右移:保持符号位不变,正数的话补0,负数补1,(补符号位)

int i = 0x80000000;
i = i >> 1;  //i的值不会变成0x40000000,而会变成0xc0000000

                当移动的位数超过类型的长度时,会取余数,然后移动余数个位.


   >>> 向右移动的过程中,不管原来数的最高位是1还是0,都补0,所以我们应该根据需要来选择,右移是用>>>还是>>


参考:http://blog.csdn.net/tdcs111/article/details/61929445.

你可能感兴趣的:(C)