C 比较 EOF 和 char 时类型转换如何工作?

问题描述 投票:0回答:1

这个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 吗?

c binary
1个回答
0
投票

问题1:为什么如果在文件中找到char 0xFF,为什么不将其转换为int类型,然后与EOF进行比较?

当在文件中找到

0xFF
(所有 8 位集)时,
unsigned char
将其读取为 getchar()(因为所有都是
字节
),然后作为
int
返回,其值为255.


问题2:如果

char
0xFF,或者二进制的1111 1111转换为int(为了简单起见,假设为16位),它会变成0000 0000 1111 1111吗?如果是这样,有符号的字符会失去其符号并将十进制值从 -1 更改为 255 吗?

如果

char
signed,则
char
0xFF 是 -1,并将其转换为
int
保留 -1 的值。

如果

char
unsigned,则
char
0xFF 为 255,并将其转换为
int
保留 255 的值。


不要以位模式的方式思考,而是以值的方式思考,以更好地理解转换。

char
signedunsigned,这是实现定义的。这两种情况在 2024 年都是合理可能的。

getchar()
通常返回 257 个不同
int
值中的 1 个:0 到 255 和
EOF
EOF
是一些负值。将
getchar()
的返回值保存到
char
中会丢失一些东西,因为 257 个不同的值无法用 8 位
char
signed char
unsigned char
进行编码。最好将
int
返回类型和值保存为
int
.

© www.soinside.com 2019 - 2024. All rights reserved.