在c++中,二进制左移在30次移位后表现如何



在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

最新更新