Подтвердить что ты не робот

Может ли реализация, имеющая sizeof (int) == 1 "полностью соответствовать"?

В соответствии с стандартом C любые символы, возвращаемые fgetc, возвращаются в виде значений unsigned char, "преобразованных в int" ( эта цитата исходит из стандарта C, заявляя, что действительно есть преобразование).

Когда sizeof (int) == 1, многие значения unsigned char находятся за пределами диапазона. Таким образом, возможно, что некоторые из этих значений unsigned char могут быть преобразованы в значение int (результат преобразования ", определяемый реализацией или определяемый реализацией сигнал поднят" ) EOF, который будет возвращен, несмотря на то, что файл фактически не находится в ошибочном состоянии или состоянии конца файла.

Я с удивлением обнаружил, что такая реализация действительно существует. Документ UCHAR_MAX TMS320C55x > CCS имеет соответствующее значение 65535, INT_MAX, имеющее 32767, fputs и fopen, поддерживающий двоичный режим... Что даже более удивительно то, что он, кажется, описывает окружающую среду как полностью соответствующую, полную реализацию (минус-сигналы).

Компилятор C55x C/С++ полностью соответствует стандарту ISO C, который определяется спецификацией ISO...

Инструменты компилятора поставляются с полной библиотекой времени выполнения. Все библиотеки функции соответствуют стандарту библиотеки ISO C....

Является ли такая реализация, которая может возвращать значение, указывающее ошибки там, где их нет, действительно полностью соответствует? Может ли это оправдываться использованием feof и ferror в разделе условий цикла (как это кажется отвратительным)? Например, while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }

4b9b3361

Ответ 1

Функция fgetc() возвращает значение int в диапазоне unsigned char только при чтении правильного символа, в противном случае возвращает EOF, который является отрицательным значением типа int.

В моем первоначальном ответе (я его изменил) предполагается, что было целочисленное преобразование в int, но это не так, так как фактически функция fgetc() уже возвращает значение типа int.

Я думаю, что для соответствия, реализация должна сделать fgetc() возвращать неотрицательные значения в диапазоне int, если только EOF не возвращается.

Таким образом, диапазон значений от 32768 до 65535 никогда не будет связан с кодами символов в реализации TMS320C55x.