| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 481 人关注过本帖
标题:EOF用char类型赋值为什么可行?
只看楼主 加入收藏
hanwang3
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2015-8-24
结帖率:60%
收藏
已结贴  问题点数:20 回复次数:9 
EOF用char类型赋值为什么可行?
EOF的值为-1,应该用int类型的变量去存放,但是我用char类型的变量存放也没出问题,不知道是什么情况?
2015-09-07 14:19
hanwang3
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2015-8-24
收藏
得分:0 
回复 2楼 边小白
char表示的都是正值,没有负的。
2015-09-07 14:35
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:7 
EOF 不是一个 char 类型值。

以 int getchar(void) 为例,
可能成功读取到任意的char字符,包括char(-1)字符。那怎么判断是读取成功还是读取失败呢?
当初的作者想到一个比较geek的办法,就是使用比char更宽的返回类型,多余部分来标识是否读取成功。

假设输入内容就是一个字符 '\xFF'
那么
int a = getchar(void); 此时 a!=EOF,成功读取到的字符为 (char)a,也就是-1
int b = getchar(void); 此时 a==EOF,表示读取失败

2015-09-07 14:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
以下是引用边小白在2015-9-7 14:41:00的发言:

你看看这里http://m.blog.,百度到的,里面明确说明char类型数据范围是-128到127。
char 的范围取决于编译器实现,另外还有一个宏 CHAR_BIT 用来标明char的位数。
于是有 -128到127的,还有0到255,甚至还出现过只有7bits有效,和大于8bits的。

后来,基本上现存的所有编译都是使用 1bytes 的char,所以C标准中半推半就的默认了char为1bytes

但 char、signed char 和 unsigned char 仍然是三种不一样的类型
虽然 char 必然和 signed char/unsigned char 其中之一的表现相同
比如,gcc 中 char 虽然和 unsigned char 不是同一种类型,但行为表现一致,取值范围是 0到255
比如,vc 中 char 虽然和 signed char 不是同一种类型,但行为表现一致,取值范围是 -128到127
(vc中也可以用编译参数将 char 指定成 无符号类型,忘了编译参数是什么了)

总结一下:
a. char的大小是1字节,但看到别人的代码用 CHAR_BIT 也不要奇怪
b. char、signed char 和 unsigned char 是三种不一样的类型
c. char可能是具符号类型,可能是无符号类型
d. char用来存字符,signed char/unsigned char存数值
2015-09-07 15:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
-1的值是0xff,赋值给unsigned char被解读为255。

授人以渔,不授人以鱼。
2015-09-07 18:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
for (unsigned int x = 10; x >= 0; --x)
{
    ;
}


想明白上面这个循环为什么是死循环,就知道顶楼问题的答案。

无论char是signed char还是unsigned char,EOF都可以赋值给char,就如-1可以赋值给unsigned int一样!

再:EOF是一个宏,在大多数平台都被定义为-1,但并非总是-1,也没谁规定它必须是-1。

[ 本帖最后由 TonyDeng 于 2015-9-7 19:08 编辑 ]

授人以渔,不授人以鱼。
2015-09-07 19:04
hanwang3
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2015-8-24
收藏
得分:0 
回复 4楼 边小白
确实是这样,一直都有误解了。
自己编程验证了一下,char可以表示正数和负数,范围是-128~+127,负数用补码表示。
2015-09-08 10:49
hanwang3
Rank: 1
等 级:新手上路
帖 子:24
专家分:7
注 册:2015-8-24
收藏
得分:0 
回复 8楼 TonyDeng
负数赋值给unsigned char和unsigned int 应该是以补码的形式赋值,比如把-1赋给unsigned char,实际输入的值是0xff,所以以十进制输出时显示255;
您给的例子因为判别式中多了一个“=”,所以当x = 0后,x-- 等于-1,补码形式为0xffffffff,判别式判断为正,继续执行。
但是我不能理解的是,此时以十进制输出时,显示的是-1,而不是4294967295?
2015-09-08 11:20
快速回复:EOF用char类型赋值为什么可行?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017229 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved