在 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
在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