4

当我阅读 K&R 时,我对这段代码感到困惑:

#include "syscalls.h"
int getchar(void)
{
    char c;

    return (read(0, &c, 1) == 1) ? (unsigned char)c : EOF;
}

据说 unsigned char 用于避免代码中符号扩展带来的错误。这是我能想到的唯一情况,我给出这个示例代码:

char c = 0xf0; //11110000, just make highest bit > 1
printf("%i\n",(int)(unsigned char)c);
printf("%i\n",(int)c);

Output:  240 // 0...011110000
         -16 // 1...111110000

但实际上ascii只是0~127的最高位不能分配给1。为什么在K&R cast char >> unsigned char?

4

3 回答 3

5

ASCII限制在范围内0..127,但不仅是 ASCII 可以被read- 在 K&R 中读取,它还可以获得整个值0..255范围char

这就是getchar返回 an的原因int,因为它必须能够返回任何值以及与 所有其他字符不同char的特殊EOF值。

通过将字符转换为 anunsigned char在将其提升为inton return 之前,它可以防止值128..255被符号扩展。如果您允许该符号扩展,您将无法区分 255(将符号扩展到所有 1 位)和EOF(即 -1,所有 1 位)之间的区别。


顺便说一句,我不完全确定您使用 K&R 学习语言的策略是一个好的策略。从那时起,C 已经走过了漫长的道路。从记忆来看,即使是最新的 K&R 书籍仍然是 C89/90 ANSI 标准(在 ISO 基本上接管之前),并且从那时起该语言已经经历了两次大规模升级。

于 2013-05-20T13:17:35.113 回答
1

unsigned char 变量的值介于 0 和 255 之间,对于类型转换的要求,请遵循同一本书的评论

Whether plain chars are signed or unsigned is machine-dependent, but printable characters are always positive.

现在,如果我们谈论 c 标准,那么它如下所示

The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.
于 2013-05-20T13:25:17.033 回答
1
return (read(0, &c, 1) == 1) ? (unsigned char)c : EOF;

意思是:将一个字符读入c;i如果您至少可以读取一个字符,请返回它;否则返回(int)EOF。

注意 getchar() 返回一个 int,因此转换是 char->unsigned char->int

于 2013-05-20T13:26:25.423 回答