Почему побитовый сдвиг инт вверх дает отрицательное число?

Я новичок в манипуляциях с битами и написал простой код, чтобы увидеть результат выполнения сдвига одного бита на одном числе viz. 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 стало нулем)?

Однако, когда я заменяю int num=2 на unsigned int num=2, я получаю тот же результат, за исключением того. что последнее число на этот раз отображается как положительное, т.е. 2147483648 вместо -2147483648

Я использую компилятор gcc на Ubuntu Linux

7
задан John Carter 3 December 2011 в 23:10
поделиться