[英]confusion about int, char, and EOF in C
我正在学习K&R的经典C编程书第二版,这是第17页的示例:
#include <stdio.h>
/* copy input to output*/
main()
{
int c;
// char c works as well!!
while ((c = getchar()) != EOF)
putchar(c);
}
在书中指出, int c
用于保存EOF
,在我带有GCC的Windows机器中,结果为-1
,不能用char
表示。 但是,当我尝试使用char c
它没有问题。 奇怪的是我尝试了更多:
int a = EOF;
char b = EOF;
char e = -1;
printf("%d %d %d %c %c %c \n", a, b, e, a, b, e);
并且输出为-1 -1 -1
,不显示任何字符(实际上根据%c, c
ASCII表%c, c
此处%c, c
应该显示nbs(no-break space)
但它是不可见的)。
那么如何在没有任何编译器错误的情况下为EOF
分配char
?
此外,假设EOF
为-1
,则b
和e
是否都在内存中分配给FF
以上? 否则编译器如何区分EOF
和nbs
...?
更新 :
最有可能的EOF 0xFFFFFFFF
被强制转换为char 0xFF
但是在(c = getchar()) != EOF
中,LHS 0xFF
在比较之前被int提升为0xFFFFFFFF
,因此c
类型可以是int
或char
。
在这种情况下, EOF
恰好是0xFFFFFFFF
但理论上EOF
可以是任何需要8位以上的值才能正确表示的最左端字节(不一定是FFFFFF
因此char c
方法将失败。
参考:K&R C编程语言2e
该代码有效,因为您使用的是签名 char
。 如果查看ASCII表 ,则会发现两件事:首先,只有127个值。 127需要七个位来表示,而最高位是符号位。 其次, EOF
不在此表中,因此OS可以自由定义它。
编译器允许从char
到int
赋值,因为您是从较小的类型分配为较大的类型。 保证int
能够表示char
可以表示的任何值。
还需要注意的是0xFF
时解释为等于255 unsigned char
和-1时,解释为一个signed char
:
0b11111111
但是,当表示为32位整数时,它看起来非常不同:
255 : 0b00000000000000000000000011111111
-127: 0b11111111111111111111111110000001
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.