在C语言中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变。
这样做的目的主要是在编程时,用左/右移做快速的乘/除运算,避免做多次乘除运算时所花费的时间。
1、左移<<:转为二进制(补码)后,将数的整体向左移动,丢弃高位,用0补低位,从而实现2^n倍的乘法操作。
2、右移>>:转为二进制(补码)后,将数的整体向右移动,最高位的符号位不变,丢弃低位,从而实现除以2^n的除法操作。
假如计算中遇到超过当前二进制数总位数的情况,默认会求移位数与位数的余数,将其作为实际的移动位数。
此外,我们常常说的计算机字长指的是CPU通用寄存器的数据处理长度,也就是广告中提及的64位CPU,它是指单位时间内能被处理的数据长度,与决定CPU寻址范围的位数并不等同。
比如Intel80286CPU的数据总线数为16位,而地址总线是24位,其寻址范围是2^24=16Mb。
所谓32位CPU不支持大于4G的内存,主要指的是其地址寄存器是32位,最大的寻址范围是2^32=4096Mb。