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

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

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

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

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

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

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

1 ответ

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

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

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

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

Другие вопросы по тегам