Почему битовое смещение int вверх дает отрицательное число? - PullRequest
7 голосов
/ 04 декабря 2011

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

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

Ответы [ 3 ]

16 голосов
/ 04 декабря 2011

Это потому, что int является целым числом со знаком.В представлении дополняющего два знак целого числа определяется самым старшим битом.

Как только вы сдвинули 1 в старший бит (знак), он переворачивает отрицательный.

При использовании unsigned бит знака отсутствует.

0x80000000 = -2147483648 for a signed 32-bit integer.
0x80000000 =  2147483648 for an unsigned 32-bit integer.

РЕДАКТИРОВАТЬ:

Обратите внимание, что строго говоря, целочисленное переполнение со знакомявляется неопределенным поведением в C / C ++.Поведение GCC в этом аспекте не является полностью согласованным:

2 голосов
/ 04 декабря 2011

Хороший вопрос!Ответ довольно прост.

Максимальное целочисленное значение равно 2^31-1.31 (не 32) есть по причине - последний бит в целом числе используется для определения, является ли это положительным или отрицательным числом.

Если вы продолжите сдвигать бит влево, вы в конечном итогенажмите этот бит, и он станет отрицательным.

Подробнее об этом: http://en.wikipedia.org/wiki/Signed_number_representations

0 голосов
/ 04 декабря 2011

Как только бит достигает знакового бита знакового (наиболее значимого бита), он становится отрицательным.

...