在C++中,int是4字节,这意味着int内存可以存储32位,那么是怎么来的
int i = 1;
i = i<<32;
cout<<i<<endl;
给我以下错误:-
main.cpp:7:5: warning: shift count >= width of type
[-Wshift-count-overflow]
i <<= 32;
而
int i = 1;
i = i<<31;
cout<<i<<endl;
给我
./main
-2147483648
和
int i = 1;
i = i<<30;
cout<<i<<endl;
给我
./main
1073741824
发生了什么?
让我们用二进制格式表示一个数字,看看左移位的作用。
for example
if i = 5 // binary 101
i<<1 becomes 10 // binary 1010
i<<2 becomes 20 // binary 10100
and so on
类似的
if i = 1 // binary 1
i<<1 becomes 2 // binary 10
i<<2 becomes 4 // binary 100
i<<n becomes 2^n // binary 1000...n times
i<<30 becomes 2^30 // binary 1000000000000000000000000000000
如果你观察到2^n将需要n+1位来存储,这解释了你的第一个错误。2^32需要33位,std int为32位,则会出现溢出错误。
现在请注意,2^30占用31位,这是分配来表示int值的位数,因为第32位是符号位(用于区分负数和正数(。
所以,当你这样做的时候,我<lt;31,最高阶1覆盖符号位,我们得到一个负值。
c++中的负数用2s补码表示。对于32位值,2^31的2s补码是-2147483648,这就是您所看到的。
现在我<lt;当i==1仅为2^30或1073741824 时为30