C语⾔中的BYTE和char深⼊解析
例如,在下⾯的源程序中“""”之内的“你”、“好”、“,”、“C”、“!”、“\n”就属于程序要处理的字符。
复制代码代码如下:
#include <stdio.h>
int main(void)
{
printf("你好,C!\n");
return 0;
}
该源程序中的其他字符则属于书写源程序的字符,这其中也可能包含并没有明显显⽰出来的字符,例如空格字符(space character)、⽔平制表符(horizontal tab)、垂直制表符(vertical tab)和换页符(form feed)。
从某种意义上来说,编辑/编译器是⼀种接受字符输⼊,输出可执⾏⽂件的软件,由它产⽣可执⾏⽂件经过加载成为内存中的程序,这个程序通常也不可避免地要处理字符。
编辑/编译器与它⽣产出的应⽤程序并不⼀定运⾏在同⼀个环境中,这就意味着两者可能要各⾃处理不同的字符集合。
编辑/编译器所要处理的字符就是书写C语⾔源程序所⽤的字符,这种字符的集合叫源字符集(sourcecharacter set)。⽽应⽤程序要处理的字符所构成的集合叫执⾏字符集(execution character set)。
对于多数C语⾔学习者来说,由于编辑/编译环境与应⽤程序运⾏环境是重合的,可能意识不到源字符集与执⾏字符集之间的区别。
源字符集中的字符就是编写C语⾔源程序的字符,也就是C语⾔要求编辑/编译器所运⾏的环境所提供的字符。这套字符由这⼏部分组成:基本字符集(basic character set)、表⽰换⾏的字符(new-line character)和扩展字符(extended characters)。
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m
n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~
空格(space character)
⼀共是95个。这就是C语⾔对编辑/编译器运⾏环境的最基本的要求,⾔外之意就是只要编辑/编译器所运⾏环境提供这95个字符就可以编写C语⾔程序了。事实上C语⾔源程序也“主要”地由这95个字符组成。
此外,C语⾔还要求在编辑/编译器运⾏的环境中,0~9这⼗个字符的编号(编码)必须是连续的。
遗憾的是,有些环境⽆法全部提供这95个字符。例如,据说有些国家的键盘上压根就没有“[”这个键。
由于存在这种情况,所以C语⾔也容许⽤所谓的三字符序列(trigraph)来表⽰那些环境不提供的字符。
⽐如⽤“??<”表⽰“{”,
⽤“??>”表⽰“}”。下⾯的代码尽管看起来有些怪异,然⽽依然是合法的C程序。
复制代码代码如下:
#include<stdio.h>
int main(void)
<
printf("你好,C!\n");
return 0;
>
编译器也可以对基本字符集⾃⾏进⾏扩展,这就是所谓的扩展字符(extended characters)。前⾯代码中的“你”、“好”就属于扩展字符。这些扩展字符只能出现在标识符、字符常量、字符串字⾯量、头名(header name)、注释以及某些预处理单词(preprocessing token that is never converted to a token)中。
代码的其他其他部分出现扩展字符则是⼀种未定义⾏为。
扩展字符的值是由具体的编译器定义的。源程序可以使⽤的所有字符的集合叫做扩展字符集(extended character set)。
应⽤程序运⾏的环境中的字符集(the execution character set)也是⼀种扩展字符集(extended character set)。
其中也必须包括前⾯提到的源字符集中的那95个基本字符集,0~9这⼗个字符的编码也必须是连续的。
特别需要注意的是,C语⾔并没有要求执⾏环境中的基本字符集和编辑/编译环境中的基本字符集具有相同的编码⽅式,尽管这两个基本字符集的“符”是相同的。
执⾏环境中必须提供的字符还有alert,backspace,carriage return,new line以及⼀个各位都为0的字符(null character)。
执⾏环境中程序可以处理的其他字符也被叫做扩展字符(extended characters),这些扩展字符与基本字符集以及
c语言char的用法
alert,backspace,carriage return,new line和null character共同构成了执⾏环境中的扩展字符集(extended character set),或称之为执⾏字符集(the execution character set)。
对于执⾏环境来说,扩展字符(extended characters)同样是由编译器⾃⾏定义的。
C语⾔中的Byte,如同int等类型类似,同样不是⼀个确定长度的位组。C语⾔只是要求Byte能放得下执⾏环境中和编辑/编译环境中基本字符集的编码。这样在某些编译器中C语⾔中的Byte是9位就不难理解了,这并不违背C语⾔的基本定义。
同样的道理,如果在编辑/编译环境中,基本字符集的编码是8位,⽽在运⾏环境中基本字符集的编码是16位的话,那么Byte的⼤⼩显然就必须⾄少为16位。
由此可见,在C语境中的Byte并⾮是平时普遍认为的octet(8位组)。
C语⾔中的char数据类型是⼀种整数类型(integer type),它的⼤⼩被定义为1个Byte。亦即
sizeof (char)  ≡ 1
若需要知道某个具体编译器的Byte究竟是多少位,可以查看编译器提供的limits.h。其中定义的符号常量CHAR_BIT就是char 类型的位数,也就是Byte的位数。
"addressable unit of data large enough to hold any member of the basic character set of the execution environment" (clause 3.6 of the C standard)
The representation of each member of the source and execution basic character sets shall fit in a byte.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。