左移:不管是有符号数还是无符号数,数位都往左移动n位,右边用0补足。如果左移的位数超过整数本身的位数,结果不知道。VS上测试结果是从头开始。
例子(VS,32位机器):
int类型,原始值0x1,左移31位后是0x80000000。左移32位后是0x1。原始值0x11,左移31位后是0x80000000,左移32位后是0x11。
unsigned int类型,同上。
右移:右移包括逻辑右移和算术右移。对于无符号数,只有逻辑右移,对于有符号数,可以逻辑右移,也可以算术右移,具体的实现因编译器的不同而不同。
逻辑右移是在左端补0,算术右移是在左端补符号位,如果是正数就补0,如果是负数就补1。
在本机上做实验,对于无符号数,采用算术右移。
例子:
unsigned int类型,原始值0x80000000,右移一次为0x40000000。
int类型,原始值0x80000000,右移一次为0xC0000000。
如果移位位数超过整数本身的位数,结果从头开始。同左移。