簡體   English   中英

為什么向上移位int會產生負數?

[英]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在這方面的行為並不完全一致:

好問題! 答案很簡單。

最大整數值為2^31-1 31(不是32)是有原因的 - 整數的最后一位用於確定它是正數還是負數。

如果你繼續向左移動位,你最終會擊中這一位並且它變為負數。

有關此內容的更多信息: http//en.wikipedia.org/wiki/Signed_number_representations

一旦該位到達有符號(最高有效位)的符號位,它就變為負數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM