побитовый оператор смещения, кажется, переносится? - PullRequest
3 голосов
/ 05 июня 2019

Это 32-разрядная версия Windows 7, Visual Studio 2017, в файле C.

int i = 65536;

Как и ожидалось,

i >> 0 = 65536
i >> 1 = 32768
  :
  :
i >> 16 = 1
i >> 17 to 31 = 0.

i >> 32 снова магически 65536, хотя,Насколько это законно?

ИСО / МЭК 9899: TC2 говорит следующее, и я предполагаю, что спецификации C ++ совпадают?

Результат E1 >> E2 смещен вправо на E1Е2 битовые позиции. Если E1 имеет тип без знака или E1 имеет тип со знаком и неотрицательное значение, значение результата является неотъемлемой частью отношения E1 / 2 ^ E2. Если E1 имеет тип со знаком иотрицательное значение, результирующее значение определяется реализацией.

1 Ответ

11 голосов
/ 05 июня 2019

6.5.7p3

... Если значение правого операнда отрицательно или больше или равна ширине повышенного левого операнда , поведение не определено .

С помощью clang, gcc и icc вы получите предупреждение , если попытаетесь сместиться на постоянную, которая больше или равна ширине смещенного значения, и вам даже не нужно любые дополнительные флаги командной строки.

...