具有sizeof(int)== 1“完全符合”的实现可以吗?

时间:2015-06-15 01:19:52

标签: c c99 c11

根据the C standardfgetc返回的任何字符都会以unsigned char值的形式返回,“转换为int”(该引用来自C标准,说明确实存在转换)。

sizeof (int) == 1时,许多unsigned char值超出范围。因此,有些unsigned char值可能会最终转换为int的{​​{1}}值(转换结果为"implementation-defined or an implementation-defined signal is raised"),这将是EOF尽管文件实际上没有处于错误或文件结束状态,但仍返回。

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

  

C55x C / C ++编译器完全符合ISO规范定义的ISO C标准......

     

编译器工具带有完整的运行时库。所有图书馆   功能符合ISO C库标准。 ...

这样的实现是否可以返回一个值,表示没有的错误,真的完全符合?这可以证明在循环的条件部分中使用feofferror是合理的(这看起来很可怕)?例如,while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }

1 个答案:

答案 0 :(得分:2)

函数fgetc()仅在读取正确的字符时返回int范围内的unsigned char值,否则返回EOF,这是类型的负值int

我的原始答案(我更改了它)假设有一个整数转换为int,但事实并非如此,因为实际上函数fgetc()已经返回了int的值1}}。

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

通过这种方式,从32768到65535的值范围永远不会与TMS320C55x实现中的字符代码相关联。