具有 sizeof (int) == 1 "fully conform"的实现可以吗?

标签 c c99 c11

<分区>

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

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

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

The C55x C/C++ compiler fully conforms to the ISO C standard as defined by the ISO specification ...

The compiler tools come with a complete runtime library. All library functions conform to the ISO C library standard. ...

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

最佳答案

函数fgetc()只有在读取到一个合适的字符时才返回一个int值在unsigned char范围内,否则返回EOFint 类型的负值。

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

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

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

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

相关文章:

c - C中的建筑结构段错误

c - 在非二进制补码系统上,普通 char 通常/总是未签名吗?

c - 为什么我必须使用 gnu99 而不是 c99 来编译内核模块?

c - 使用指向第一个参数的指针迭代函数的参数

c - 了解发布顺序并在 C11 中同步

c++ - 使用 libclang/libtooling

c - C 代码中求和结果错误

linux - SA_RESTART 未在 Linux 下定义,在 Solaris 中编译良好

c - 使用 mmap 添加到结构数组

c - 为什么具有空参数列表的函数原型(prototype)与具有 char 参数的函数原型(prototype)冲突?