2015-06-15 2 views
10

В соответствии с the C standard, любые символы, возвращаемые fgetc, возвращаются в форме unsigned char значений, «преобразованных в int» (эта цитата исходит из стандарта C, в котором говорится, что действительно есть преобразование).Может ли реализация, имеющая sizeof (int) == 1 "полностью соответствовать"?

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

Я с удивлением обнаружил, что такая реализация на самом деле существует. Документы TMS320C55x CCS manualUCHAR_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))) { ... }

+3

@BLUEPIXY «Байт» в стандарте - это что-то вроде 'char'. Это не обязательно 8 бит. –

+0

Я смущен, если 'sizeof (int)' is '1', как получилось' INT_MAX' '32767'? это значение требует двух 8-битных байтов. И действительно, байт может быть более 8 бит, поэтому для определения этого используется макрос 'CHAR_BIT'. –

+3

@iharob Эта система не использует 8-битные байты. – duskwuff

ответ

2

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

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

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

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

+0

Реквизиты для просмотра здесь. Эта конкретная реализация может нарушать контракт 'fgetc' либо путем возврата отрицательного значения, когда это не должно, либо не поддерживать двоичные файлы правильно ... – Sebivor

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