我们都知道, C++中size_t 的本来面目是unsigned int
而一般情况下, size_t是4bytes, 所以size_t 的范围是[0, 2^32 - 1] (注:这是一个循环范围, "^" 为数学中的幂运算符)
那么怎样才能得到用一个size_t 类型变量得到(2^32 - 1)这个值呢
a.最快的方法是:
size_t i = 0;
--i;
b.那么,如果是这样呢:
size_t i = 1;
i <<= 32;
--i;
EXPECT_EQ(?, i);
c.这样呢:
size_t i = 1;
i <<= 31;
i <<= 1;
--i;
EXPECT_EQ(?, i);
d.再来一个:
size_t i = 1;
i <<= 31;
--i;
i <<= 1;
++i;
EXPECT_EQ(?, i);
答案是这样的:
a. (2^32 - 1)
b. 0
c. (2^32 - 1)
d. (2^32 - 1)
是的,b的结果是0
为什么呢?
其实很简单,如果让你去实现移位操作,你会怎么做?
你是不是会先通过类型知道这个变量最多可移多少位?(假设最多可移m位)
那么当用户程序想移n位时,我们可以通过这种方式得到用户程序实际能或想移动的位数:
n %= m; (求余)
所以,
当你要求移动31位时,实际上相当于移动了31位
当你要求移动32位时,实际上相当于移动了0位
当你要求移动33位时,实际上相当于移动了1位
这就是问题的根源了