当左移的位数大于等于该数值类型的最大位数时,编译器会用左移的位数对此类型的最大位数取模,然后按余数进行移位,
比如说:
0x4000 0000是31位,int型,最大32位
0x4000 0000<<1,结果是0x8000 0000,32位
0x4000 0000<<2,结果超过32位,最左边的1被移出,剩下的32位全是0,所以结果是0x0000 0000,即0
一直到0x40000000<<31,都会将左边的数左移,最左边的1被移出,剩下全是0,所以结果都是0
0x4000 0000<<32,此时32位等于int型最大位数,所以左移位数为32%32=0,即左移0位,所以仍为原数
0x4000 0000<<33,此时33>32,故左移位数为33%32=1,即左移1位,结果为0x8000 0000,32位
0x4000 0000<<34,此时34>32,左移位数为34%32=2,左移2位,由前面的运算已经知道,0x40000000<<2后是0
一直到0x40000000<<63,此时相当于左移63%32=31位,
0x4000 0000<<64,此时左移64%32=0,相等于左移32位,也相当于左移0位,结果为原数。
依次类似。
|