C中的符号扩展,char>unsigned char

pup*_*007 4 c casting char bit

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

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

    return (read(0, &c, 1) == 1) ? (unsigned char)c : EOF;
}
Run Code Online (Sandbox Code Playgroud)

据说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
Run Code Online (Sandbox Code Playgroud)

但实际上 ascii 只是 0~127 最高位不能分配给 1.Why in K&R cast char >> unsigned char?

pax*_*blo 5

ASCII限制在范围内0..127,但它是唯一可以通过阅读不ASCII read-在K&R,它可以得到整个0..255的范围char值。

这就是getchar返回 an的原因int,因为它必须能够返回任何 char值加上特殊EOF值。

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

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