[an error occurred while processing this directive]
|
"С для микроконтроллеров" действительно нет - просто потому, что стандарт языка описывает абстрактную модель вычислений, не привязываясь к конкретной архитектуре, на которой эти вычисления будут исполняться. Нет разницы, на микроконтроллере или на суперкомпьютере. А стандарты есть, и, более того, они международные. См. например, ISO/IEC 9899:1990 в качестве примера. Другое дело, что стандарт эволюционирует вместе с языком, поэтому периодически выходят обновленные версии стандарта. Но говорить, что есть несколько стандартов - нельзя. Есть Стандарт - это последняя версия, и есть предыдущие версии стандарта. На последнюю версию и ориентируются разработчики компиляторов, а если не могут вовремя поддержать его новые свойства - тогда продают компилятор, работающий с предпоследней или даже более ранней версией стандарта.
Только к обсуждаемому вопросу это не имеет никакого отношения: целочисленное расширение char до int при вычислении выражений было в C всегда еще со времен K&R и зафиксировано во всех редакциях стандарта. Так что мое утверждение остается в силе - если компилятор для ((unsigned char)16)<<8 дает ноль, это противоречит стандарту С, а значит есть два варианта:
1. Если такое поведение непредусмотрено - значит, это ошибка компилятора.
2. Если такое поведение предусмотрено, так как включена соответствующая опция в проекте - тогда компилятор делает правильно, но язык, который он компилирует - это не С. Я не говорю, что это плохо - но это именно нестандартное расширение.
Стандарт языка очень четко описывает при соблюдении каких требований программа будет выполняться на всех машинах одинаково, и какие вещи могут быть реализованы разными компиляторами по-разному. Так вот, ни один совместимый со стандартом компилятор не имеет права не расширять char до int при вычислении выражений.
А по поводу непереносимости "любого неявного или арифметического преобразования типов" - так Вы тут просто говорите неправду. Прежде всего возникает вопрос, а при чем здесь "или"? И второй вопрос: дана функция на С
unsigned int f( unsigned char w )
{
return w;
}
Не могли бы Вы привести в качестве примера какое-нибудь значение w и два различных числа, допустимых в качестве результата функции f(w) для различных реализаций языка C, каждая совместимая хоть с одной версией стандарта языка? Что, не можете?
E-mail: info@telesys.ru