ASCII中的-1?

问题来源:我在对文件进行Huffman编码压缩调试时,查看文件中字符个数总是比预想的多出一个。之后我尝试%c查看字符的值,似乎是两个空格的字符。事情变得愈发奇怪然后我机智的心生一计,打印它的ASCII码然后查询ASCII表,竟然是…-1???事情变得更加奇怪了…


我们通常认为的ASCII码的范围是8位的,也就是十进制范围0~255。
(0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字;65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。)

ASCII中的-1?_第1张图片

那么ASCII码中的-1表示什么含义呢?
百度“ASCII码值-1什么含义”并没有答案,我发现这个字符出现的位置是文件结尾,我想到EOF字符,这次百度给出了答案,在C标准库中,像getchar这样的数据读取函数返回一个与符号(宏)EOF相等的值来指明文件结束的情况发生,EOF的真实值与不同的平台有关(但通常是-1,比如在glibc中),并且不等于任何有效的字符代码。块读取函数返回读取的字节数,如果它小于要求读取的字节数,就会出现一个文件结束符。

我的理解是:ASCII码的值确实是非负的,但是在C/C++标准库中,宏定义#define EOF -1,用在读文件的时候(如fscanf、fgetc、fgets等),因为字符的值(ASCII码值)一定非负,C/C++语言采用这种方式标记文件的结尾。

具体实用价值,可以慢慢摸索。


最后我们区分一下三个结束符EOF、’\0’和’\n’:
EOF(End Of File):标记文件结尾,无实际值和有效字符代码,是宏定义标记,C中标记-1,文件读取相关函数,如fscanf、fgetc、fgets等会用到。
‘\0’:转义字符,值等于0,主要用在C字符串的结尾,标记字符串结束。字符串相关函数,如strcmp、strcpy等会用到。
‘\n’:表示换行符,值等于10,标记读取函数读取结束,读取相关函数,如scanf、getchar、gets等,一旦遇到’\n’就结束读取并返回。

你可能感兴趣的:(ASCII,EOF)