在 C++ 中进行 30 次移位后,二进制左移的表现如何?

how does the binary left shift is behaving after 30 shift in c++?

在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位是符号位(区分负数和正数)。

因此,当您执行 i<<31 时,最高位 1 会覆盖符号位,我们得到一个负值。

c++ 中的负数使用 2 的补码表示。 32 位值的 2^31 的 2s 补码是 -2147483648,这就是您所看到的。

现在 i<<30 当 i==1 只是 2^30 或 1073741824