从这个SO答案,我的理解是以下C代码是不好的做法,因为将
c
声明为char
将使像0xFF这样的字符和EOF
常量难以区分。
char c;
while ((c = getchar()) != EOF) {
...
}
然而,在这个SO答案中详细介绍了当操作两个不同类型的整型操作数时(在本例中为!=),这两种类型被转换为通用类型。通常是具有更多位的类型。
问题1: 那么为什么如果在文件中找到
char
0xFF,它不会被转换为 int
类型,并将 then 与 EOF
进行比较?
问题2: 如果
char
0xFF,或者以二进制表示,1111 1111
is 转换为 int
(为简单起见,假设为 16 位),那么它会变成 0000 0000 1111 1111
吗?如果是这样,有符号的字符会失去其符号并将十进制值从 -1 更改为 255 吗?
问题1:为什么如果在文件中找到char 0xFF,为什么不将其转换为int类型,然后与EOF进行比较?
当在文件中找到
0xFF
(所有 8 位集)时,unsigned char
将其读取为 getchar()
(因为所有都是 字节),然后作为
int
返回,其值为255.
问题2:如果
0xFF,或者二进制的1111 1111转换为int(为了简单起见,假设为16位),它会变成0000 0000 1111 1111吗?如果是这样,有符号的字符会失去其符号并将十进制值从 -1 更改为 255 吗?char
如果
char
是 signed,则 char
0xFF 是 -1,并将其转换为 int
保留 -1 的值。
如果
char
为 unsigned,则 char
0xFF 为 255,并将其转换为 int
保留 255 的值。
不要以位模式的方式思考,而是以值的方式思考,以更好地理解转换。
char
是 signed 或 unsigned,这是实现定义的。这两种情况在 2024 年都是合理可能的。
getchar()
通常返回 257 个不同 int
值中的 1 个:0 到 255 和 EOF
。 EOF
是一些负值。将 getchar()
的返回值保存到 char
中会丢失一些东西,因为 257 个不同的值无法用 8 位 char
、signed char
和 unsigned char
进行编码。最好将 int
返回类型和值保存为 int
.