[英]Why does bit-shifting an int upwards produce a negative number?
我是位操作技巧的新手,我寫了一個簡單的代碼,看看在單個數字上進行單位移位的輸出。 2
#include <iostream>
int main(int argc, char *argv[])
{
int num=2;
do
{
std::cout<<num<<std::endl;
num=num<<1;//Left shift by 1 bit.
} while (num!=0);
return 0;
}
輸出如下。
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824
-2147483648
顯然,連續比特移位到左邊由1個比特,將導致零,因為它已經在上面進行,但為什么計算機輸出在終止循環之前的非常結束負數(因為NUM接通零)??
但是當我用unsigned int num=2
替換int num=2
然后我得到相同的輸出,除了最后一個數字是這個時間顯示為正數,即2147483648
而不是-2147483648
我在Ubuntu Linux上使用gcc
編譯器
那是因為int
是有符號整數。 在二進制補碼表示中 ,整數的符號由最高位確定。
一旦你將1移動到最高(符號)位,它就會翻轉為負數。
當你使用unsigned
,沒有符號位。
0x80000000 = -2147483648 for a signed 32-bit integer.
0x80000000 = 2147483648 for an unsigned 32-bit integer.
編輯:
請注意,嚴格來說,有符號整數溢出是C / C ++中未定義的行為。 GCC在這方面的行為並不完全一致:
num = num << 1;
或者num <<= 1;
通常表現如上所述。 num += num;
或num *= 2;
實際上可能會進入GCC的無限循環 。 好問題! 答案很簡單。
最大整數值為2^31-1
。 31(不是32)是有原因的 - 整數的最后一位用於確定它是正數還是負數。
如果你繼續向左移動位,你最終會擊中這一位並且它變為負數。
有關此內容的更多信息: http : //en.wikipedia.org/wiki/Signed_number_representations
一旦該位到達有符號(最高有效位)的符號位,它就變為負數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.