计算机中所有的信息,包括磁盘文件、内存中的程序、内存中的数据,都是由一串比特(byte)表示的。如下图所示,程序员通过编辑器创建并保存的文本文件:hello.c。
hello的源程序
在计算机中,源程序实际上就是由0和1组成的位序列,8个位组织成一组,成为字节,每个字节表示程序中相应的文本字符。
现代计算机系统使用ASCII标准来表示文本字符,这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符。如下图所示,hello.c程序每个字符的ASCII码表示。
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像数字0~9,大小写字母A~Z,a~z,还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了常用符号用哪些二进制数来表示。
hello的ASCII文本表示
hello.c程序以字节序列的方式储存在文件中,每个字节都有一个整数值,对应于某些字符。如:
- 第一个字节的整数值是35,对应的字符为“#”;
- 第二个字节的整数值是105,对应的字符为“i”;
- 每行都以一个看不见的换行符“\n”来结束,对应的整数值为10.
可以看到,计算机中区分不同数据对象的唯一方法就是我们读到这些数据对象时的上下文,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。
扩展阅读ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是一套基于拉丁字母的字符编码,共收录了 128 个字符,用一个字节就可以存储,它已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准,适用于所有拉丁文字字母。
ASCII 编码中第 0~31 个字符(开头的 32 个字符)以及第 127 个字符(最后一个字符)都是不可见的(无法显示),但是它们都具有一些特殊功能,所以称为控制字符( Control Character)或者功能码(Function Code)。
- NUL(0):空字符。起初表示此位置什么都不做,忽略一个字符。后来用于C语言中,表示字符串的结束,当一个字符串中间出现NUL时就意味着这是一个字符的结尾。
- STX(2)和ETX(3):分别表示文本开始和文本结束。通过某种通讯协议去传输的一个数据(包),称为一帧的话,常会包含一个帧头,包含了寻址信息,即要发给谁,要发送到的目的地,其后跟着真正要发送的数据内容。
- BS(8):BackSpace,退格键。起初在打印机和打字机上,往回移动一格光标,起到强调该字符的作用。现在所用的退格键,不仅表示光标往回移动一格,同时也删除了该位置的字符。
- DEL(127):Delete,删除。为何 ASCII 编码中其它控制字符的值都很小(即 0~31),而 DEL 的值却很大呢(为 127)?这是由于这个特殊的字符是为纸带而定义的,绝大多数的纸带都是用7个孔洞去编码数据的。而 127 这个值所对应的二进制值为111 1111(所有 7 个比特位都是1),将 DEL 用在现存的纸带上时,所有的洞就都被穿孔了,就把已经存在的数据都擦除掉了,从而起到了删除的作用。
ASCII 编码中32~126(共95个)是字符,其中48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
ASCII码
,