This question already has answers here:
Can sizeof(int) ever be 1 on a hosted implementation?

(8个答案)


5年前关闭。




根据the C standard,由fgetc返回的任何字符都以unsigned char值的形式返回,“转换为int”(引用来自C标准,表示确实存在转换)。

sizeof (int) == 1时,许多unsigned char值超出范围。因此,这些unsigned char值中的某些可能最终会转换为intEOF值(转换的结果为"implementation-defined or an implementation-defined signal is raised"),尽管文件实际上未处于错误或文件末尾,该值仍会返回状态。

我很惊讶地发现这样的实现确实存在。 TMS320C55x CCS manual记录了对应值65535的UCHAR_MAX,具有32767的INT_MAXfputsfopen支持二进制模式……更令人惊讶的是,它似乎将环境描述为一个完全符合要求的完整实现(减去信号)。



这样的实现是否可以返回一个值,该值指示完全没有错误的错误?这是否可以在循环的条件部分使用feofferror进行辩解(看起来如此可怕)?例如while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }

最佳答案

仅当读取了适当的字符时,函数fgetc()才返回int范围内的unsigned char值,否则它返回EOF,它是int类型的负值。

我最初的答案(我更改了它)假设存在到int的整数转换,但事实并非如此,因为实际上fgetc()函数已经返回了int类型的值。

我认为,为了符合规范,除非返回fgetc(),否则实现必须使int返回EOF范围内的非负值。

这样,从32768到65535的值范围将永远不会与TMS320C55x实现中的字符代码相关联。

关于具有sizeof(int)== 1 "fully conform"的实现可以吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30836207/

10-12 14:26
查看更多