一、左移
例1:
若 int i = 0x400000000; // 0100...00(32位)
执行 i = i << 1;
则 i = 0x80000000; // 1000...00(32位)
可以看到i的符号位被设置为1,即 i = -2147483648
再执行 i = i << 1;
则 i = 0; // 000...00(32位)
*注: C语言的左移操作采用了丢弃最高位的处理方法。
例2:
若 unsigned i = 0x40000000;// 0100...00(32位)
i = i << 1;
则 i = 2147483648// 1000...00(32位)
再执行 i = i << 1;
则 i = 0; // 000...00(32位)
二、右移
例1:
若 int i = 0x80000000; // 1000...000(32位)
执行 i = i >> 1;
则 i = 0xC0000000; // 1100...00(32位)
再执行 i = i >> 1;
则 i = 0xE0000000; // 1110...00(32位)
*注: C语言的右移操作采用了符号位参与移位的方式,对于正数进行补0,负数补1。
例2:
若 unsigned i = 0x80000000;
i = i >> 1;
则 i = 0x40000000;
再执行 i = i >> 1;
则 i = 0x20000000;