2012-06-26 2 views
7

Как и на вопрос Bitshift and integer promotion?, у меня есть вопрос о продвижении по целому ряду при использовании левых битов.Целое продвижение с оператором <<

unsigned int test(void) 
{ 
    unsigned char value8; 
    unsigned int result; 

    value8 = 0x12; 
    result = value8 << 8; 
    return result; 
} 

В этом случае, будет ценности8 первым способствовать unsiged INT или это зависит от конкретной реализации?

6.5.7 Битовые операторы сдвига ... 3 Sematics ...
Целые акции выполняются на каждом из операндов. Тип результата - , что и для продвинутого левого операнда. Если значение правого операнда отрицательное или больше или равно ширине продвинутого левого операнда, поведение не определено.

В нем говорится, что «Целые рекламные акции выполняются для каждого из операндов»., но что это за правило продвижения?

Я предполагаю, что это должно быть convert to int if lesser rank than int, но я не могу его найти.

Я прошу об этом, поскольку один компилятор (Renesas nc30wa) не продвигает к int, поэтому результат всегда равен 0 для моего образца.

На этой платформе символ имеет ширину 8 бит и int 16 бит.

+2

Если значение8 не продвинуто, это ошибка компилятора. –

+1

Действительно ли это вопрос, является ли это ошибкой или спецификой реализации? – jeb

+0

@jeb См. Редактирование в моем ответе, некоторые компиляторы отключают целочисленные рекламные акции по умолчанию и документируют его в документации компилятора. Вы должны искать соответствие ISO в документации компилятора. – ouah

ответ

12

Фраза «целые акции» очень специфическая вещь, найденная в (для C99) раздел 6.3.1.1 Booleans, characters, and integers:

Если INT может представлять все значения исходного типа, значение преобразуется в значение INT; в противном случае он преобразуется в беззнаковый int. Они называются целыми акциями. Все остальные типы не изменяются целыми акциями.

Так предполагается, что ваш unsigned char может быть проведен в int, это будет способствовать к int. На тех редких платформах, где unsigned char такой же широкий, как и int, он будет продвигать до unsigned int.

Это лишь незначительно изменен в С11:

Если INT может представлять все значения исходного типа (как ограниченное по ширине, для битового поля), значение превращают в INT; в противном случае он преобразуется в unsigned int.Они называются целыми акциями. Все остальные типы не изменяются целыми рекламными акциями .

Если конкретный компилятор не соблюдает это поведение, то это не совсем соответствует. Однако, учитывая, что компилятор, который вы указали, предназначен для встроенных систем, это не удивительно.

Многие из них построены для конкретных целей, и соответствие не всегда велико в списке требований. Могут быть флагов компилятора, которые позволят ему более точно соответствовать стандарту.


Глядя на ваш частности среды, M16C Series,R8C Family C Compiler Package V.5.45 C Compiler (см here) имеет, в разделе 2.1.4 nc30 Command Line Options, подраздел f. Generated code modification options:

-fextend_to_int (-fETI):
          Выполняет операцию после расширения данных типа char до типа int. Расширены в соответствии со стандартами ANSI.

, хотя я подозреваю, что -fansi, вероятно, лучший выбор, так как он охватывает и другие вещи.

3

value8 повышен до int, предполагая ранг преобразования unsigned char ниже преобразование ранга int (обычно бывает на большинстве платформ).

Коды преобразования целых чисел описаны в C99 в 6.3.1.1.

Обратите внимание, что некоторые компиляторы по умолчанию отключают правила целых рекламных акций. Например, компилятор MicroChip MPLAB C18. Посмотрите соответствие ISO в документации вашего компилятора.

Смежные вопросы