Битовый сдвиг автоматически переводит символы в int?

Я где-то читал, что побитовый сдвиг автоматически превращает операнд в целое число. Но я не уверен, что это утверждение следует квалифицировать как «если операнды имеют неравный тип».

char one = 1, bitsInType = 8;
one << (bitsInType - one);

Результатом второй строки по умолчанию является int или char?


person pyrrhic    schedule 22.08.2013    source источник
comment
@MarkRansom: я не думаю, что это хороший дубликат. Этот вопрос касается того факта, что обычные арифметические преобразования не выполняются. Этот вопрос касается того факта, что выполняются целочисленные рекламные акции.   -  person Eric Postpischil    schedule 22.08.2013


Ответы (2)


Тип результата int в обычных реализациях C.1

Согласно C 2011 (N1570) 6.5.7, «целочисленные продвижения выполняются для каждого из операндов. Тип результата — тип расширенного левого операнда».

В соответствии с 6.3.1.1 2 целочисленные повышения для объектов или выражений целочисленного типа с рангом меньше или равным рангу int и unsigned int: «Если int может представлять все значения исходного типа (ограниченные шириной для битового поля), значение преобразуется в int; в противном случае он преобразуется в unsigned int».


1В другом месте в Stack Overflow обсуждалось, что странная реализация C может иметь char той же ширины, что и int, что приводит к некоторому необычному поведению.

person Eric Postpischil    schedule 22.08.2013

Стандарт C11, раздел 6.5.7 Операторы побитового сдвига, гласит:

Целочисленные продвижения выполняются для каждого из операндов. Тип результата соответствует повышенному левому операнду.

Это означает, что значения преобразуются в int, а затем выполняется операция; результат вашего выражения int.

person Fabio A. Correa    schedule 22.08.2013