也许我想多了,因为它似乎应该容易得多。我想取一个 int 类型的值,例如 fgetc() 返回的值,如果它不是文件结尾代码,则将其记录在 char 缓冲区中。例如:
char buf;
int c = fgetc(stdin);
if (c < 0) {
/* handle end-of-file */
} else {
buf = (char) c; /* not quite right */
}
但是,如果平台已签署默认字符,则 fgetc() 返回的值可能超出 char 的范围,在这种情况下,将其强制转换或分配给 (signed) char 会产生实现定义的行为(对吗?)。但是,当然,有大量代码与示例完全相同。这一切都依赖于实现定义的行为和/或假设 7 位数据吗?
在我看来,如果我想确定我的代码行为由 C 定义为我想要的,那么我需要做这样的事情:
buf = (char) ((c > CHAR_MAX) ? (c - (UCHAR_MAX + 1)) : c);
我认为无论默认字符是有符号还是无符号,甚至不管字符的大小如何,都会产生定义的、正确的行为。是对的吗?是否真的需要这样做以确保可移植性?