Изместването на битовете автоматично ли повишава символите в int?

Четох някъде, че побитовото изместване автоматично превръща операнда в 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