C语言中的BYTE和char深入解析
例如,在下面的源程序中“""”之内的“你”、“好”、“,”、“C”、“!”、“\n”就属于程序要处理的字符。
#include<stdio.h>
intmain(void)
{
printf("你好,C!\n");
return0;
}
该源程序中的其他字符则属于书写源程序的字符,这其中也可能包含并没有明显显示出来的字符,例如空格字符(spacecharacter)、水平制表符(horizontaltab)、垂直制表符(verticaltab)和换页符(formfeed)。
从某种意义上来说,编辑/编译器是一种接受字符输入,输出可执行文件的软件,由它产生可执行文件经过加载成为内存中的程序,这个程序通常也不可避免地要处理字符。
编辑/编译器与它生产出的应用程序并不一定运行在同一个环境中,这就意味着两者可能要各自处理不同的字符集合。
编辑/编译器所要处理的字符就是书写C语言源程序所用的字符,这种字符的集合叫源字符集(sourcecharacterset)。而应用程序要处理的字符所构成的集合叫执行字符集(executioncharacterset)。
对于多数C语言学习者来说,由于编辑/编译环境与应用程序运行环境是重合的,可能意识不到源字符集与执行字符集之间的区别。
基本字符集(basiccharacterset)包括:
ABCDEFGHIJKLM
NOPQRSTUVWXYZ
abcdefghijklm
nopqrstuvwxyz
0123456789
!"#%&"()*+,-./:
;<=>?[\]^_{|}~
空格(spacecharacter)
控制符:horizontaltab,verticaltab,formfeed
一共是95个。这就是C语言对编辑/编译器运行环境的最基本的要求,言外之意就是只要编辑/编译器所运行环境提供这95个字符就可以编写C语言程序了。事实上C语言源程序也“主要”地由这95个字符组成。
此外,C语言还要求在编辑/编译器运行的环境中,0~9这十个字符的编号(编码)必须是连续的。
遗憾的是,有些环境无法全部提供这95个字符。例如,据说有些国家的键盘上压根就没有“[”这个键。
由于存在这种情况,所以C语言也容许用所谓的三字符序列(trigraph)来表示那些环境不提供的字符。比如用“??<”表示“{”,用“??>”表示“}”。下面的代码尽管看起来有些怪异,然而依然是合法的C程序。
#include<stdio.h>
intmain(void)
??<
printf("你好,C!\n");
return0;
??>
编译器也可以对基本字符集自行进行扩展,这就是所谓的扩展字符(extendedcharacters)。前面代码中的“你”、“好”就属于扩展字符。这些扩展字符只能出现在标识符、字符常量、字符串字面量、头名(headername)、注释以及某些预处理单词(preprocessingtokenthatisneverconvertedtoatoken)中。代码的其他其他部分出现扩展字符则是一种未定义行为。
扩展字符的值是由具体的编译器定义的。源程序可以使用的所有字符的集合叫做扩展字符集(extendedcharacterset)。
其中也必须包括前面提到的源字符集中的那95个基本字符集,0~9这十个字符的编码也必须是连续的。
特别需要注意的是,C语言并没有要求执行环境中的基本字符集和编辑/编译环境中的基本字符集具有相同的编码方式,尽管这两个基本字符集的“符”是相同的。
执行环境中必须提供的字符还有alert,backspace,carriagereturn,newline以及一个各位都为0的字符(nullcharacter)。
执行环境中程序可以处理的其他字符也被叫做扩展字符(extendedcharacters),这些扩展字符与基本字符集以及alert,backspace,carriagereturn,newline和nullcharacter共同构成了执行环境中的扩展字符集(extendedcharacterset),或称之为执行字符集(theexecutioncharacterset)。
对于执行环境来说,扩展字符(extendedcharacters)同样是由编译器自行定义的。
同样的道理,如果在编辑/编译环境中,基本字符集的编码是8位,而在运行环境中基本字符集的编码是16位的话,那么Byte的大小显然就必须至少为16位。
由此可见,在C语境中的Byte并非是平时普遍认为的octet(8位组)。
sizeof(char) ≡1
若需要知道某个具体编译器的Byte究竟是多少位,可以查看编译器提供的limits.h。其中定义的符号常量CHAR_BIT就是char类型的位数,也就是Byte的位数。
C标准的矛盾?
"addressableunitofdatalargeenoughtoholdanymemberofthebasiccharactersetoftheexecutionenvironment"(clause3.6oftheCstandard)
可是在5.2.1-3中
Therepresentationofeachmemberofthesourceandexecutionbasiccharactersetsshallfitinabyte.
相关文章
- 多线程C语言_多线程c++
- C语言根据经纬度计算距离[通俗易懂]
- 一个c语言程序能实现几种算法_C语言实现算法
- 【C语言进阶】——深入剖析数据在内存中的存储
- C语言const int *a和int*const a 的区别详解
- Linux C语言:深入理解进程信息(linuxc进程信息)
- 深入理解C语言、HTTP协议与Linux操作系统(chttplinux)
- 深入了解C语言Linux网关操作(clinux网关)
- 深入Linux C语言编程:实现跨平台链接(linuxc链接)
- 深入了解Linux下的C语言编程及semaphore的应用(linuxcsem)
- 深入学习Linux网络编程和C语言技术。(linuxc网络编程)
- 深入探究C语言MySQL死锁查看技巧(c mysql死锁查看)
- MySQL批量写入数据的C语言实现(c mysql 批量写入)
- 用C语言操作MySQL基本写入指令(c mysql怎么写入)
- C语言连接Oracle数据库的实现方法(c 连接oracle语句)
- 精通C语言,编程指尖上操控Oracle(c 语言使用oracle)
- 据库深入探索C语言操作Oracle数据库(c oracle行数)
- 深入探索C语言操作Oracle的插入语句(c oracle插入语句)
- 深入C语言把文件读入字符串以及将字符串写入文件的解决方法
- C语言关键字auto与register的深入理解
- 深入理解C语言static、extern与指针函数