My view is that a C implementation cannot satisfy the specification of certain stdio
functions (particularly fputc
/fgetc
) if sizeof(int)==1
, since the int
needs to be able to hold any possible value of unsigned char
or EOF
(-1). Is this reasoning correct?
(Obviously sizeof(int)
cannot be 1 if CHAR_BIT
is 8, due to the minimum required range for int
, so we're implicitly only talking about implementations with CHAR_BIT>=16
, for instance DSPs, where typical implementations would be a freestanding implementation rather than a hosted implementation, and thus not required to provide stdio
.)
Edit: After reading the answers and some links references, some thoughts on ways it might be valid for a hosted implementation to have sizeof(int)==1
:
First, some citations:
7.19.7.1(2-3):
If the end-of-file indicator for the input stream pointed to by stream is not set and a next character is present, the fgetc function obtains that character as an unsigned char converted to an int and advances the associated file position indicator for the stream (if defined).
If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the endof-file indicator for the stream is set and the fgetc function returns EOF. Otherwise, the fgetc function returns the next character from the input stream pointed to by stream. If a read error occurs, the error indicator for the stream is set and the fgetc function returns EOF.
7.19.8.1(2):
The fread function reads, into the array pointed to by ptr, up to nmemb elements whose size is specified by size, from the stream pointed to by stream. For each object, size calls are made to the fgetc function and the results stored, in the order read, in an array of unsigned char exactly overlaying the object. The file position indicator for the stream (if defined) is advanced by the number of characters successfully read.
Thoughts:
Reading back
unsigned char
values outside the range ofint
could simply haveundefinedimplementation-defined behavior in the implementation. This is particularly unsettling, as it means that usingfwrite
andfread
to store binary structures (which while it results in nonportable files, is supposed to be an operation you can perform portably on any single implementation) could appear to work but silently fail.essentially always results in undefined behavior. I accept that an implementation might not have a usable filesystem, but it's a lot harder to accept that an implementation could have a filesystem that automatically invokes nasal demons as soon as you try to use it, and no way to determine that it's unusable.Now that I realize the behavior is implementation-defined and not undefined, it's not quite so unsettling, and I think this might be a valid (although undesirable) implementation.An implementation
sizeof(int)==1
could simply define the filesystem to be empty and read-only. Then there would be no way an application could read any data written by itself, only from an input device onstdin
which could be implemented so as to only give positivechar
values which fit inint
.