CPP学习之——字符型(4.5)

一 前言

字符型变量存放的是字符,这个字符指的是计算机字符集中的字符(ASCII码)。字符型变量只占一个字节,我们知道一个字节为8位(二进制的8位),而最大的8位二进制数字为11111111,换算成十进制为255,因此字符型变量可存储256个字符,而一个字符可解释为0~255之间的一个数或某个ASCII码。

二 ASCII码

  • 计算机用1和0的模式给它们做的任何事情编码,有时这些数为指令,有时这些数为一些值,有时则是代码,为了将它们区分开来,一种重要的标准化代码集ASCII产生,ASCII即American Standard Code for Information Interchange的缩写形式,译文为美国标准信息交换码。
  • 它是由美国国家标准局(ANSI)制定,现已被国际标准化组织(ISO)定位国际标准,称为ISO 646准备。适用于所有拉丁文字母,ASCII码有7位码和8位码两种形式。
  • 因为1位二进制数可以表示0和1两种状态,而2位二进制数可以表示00、01、10、11四种状态;依次类推,7位二进制数可以表示2的7次方,即128种状态,每种状态都可编为一个7位的二进制码,对应一个字符,因此128种状态可以表示128个字符。
  • 第0~32号及第127号(共34个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL振铃等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。
  • 第33~126号(共94个)是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~126号为26个小写英文字母,其余为一些标点符号、运算符号等。

三 奇偶校验

3.1 概念

  • 在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位用作奇偶校验位。
  • 所谓奇偶校验,是指代码传送过程中用来校验是否出现错误的一种方法,一般分奇校验和偶校验两种。
  • 奇校验规定:正确的代码一个字节中1的位数必须是奇数,若非奇数,则在最高位添1;
  • 偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位添1

3.2 示例

  • 比如说7位二进制数0101011,我们数了数其中总共有4个1,4是个偶数,假如采用偶校验,那么就要在最高位添0,也就是00101011.
  • 刚才的讲解中我们了解到在ASCII中每个字符和标点都用一个7位二进制数表示,例如小写字母"a"用0110 0001表示。0110 0001的十进制为97,因此人们说字母"a"用ASCII码的97表示,而实际情况是97的二进制表示。01100001是字母"a"的编码,而97只是为了人们称呼起来方便。

四 字符型变量的定义与使用

4.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
using namespace std;

int main()
{
char ch;
ch='A';
cout<<ch<<endl;
cout<<(int)ch<<endl;
return 0;
}

4.2 字符型变量

1
2
3
char ch;
ch='A';
(int)ch;
  • 该语句定义了一个字符型变量,它的名字为ch。
  • 这样系统便为该变量分配了一个字节的空间,并将空间的地址赋给变量名ch。
  • ch='A' 该语句将大写字母A存储到变量名ch所代表的地址中。
  • (int)ch中,小括号中的int为所要转换的类型,称为强制类型转换

4.3 输出结果

1
2
A
65

4.4 延伸

  • 在ASCII码中,大写字符A的值被设置为67,所有的大小写字母、数字、标点符号均被指定了一个介于1~128之间的数。另外的128个标志或者符号为计算机制造者保留或者用作奇偶校验位(最高位作为奇偶校验位)

五 练习

5.1 数值0与字符'0'还是有区别的

5.1.1 代码

1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;

int main()
{
char ch=0,ch0='0';
cout<<"数字0的字符为:"<<ch<<"数字0的大小为:"<<(int)ch<<endl;
cout<<"字符0的字符为:"<<ch0<<"字符0的大小为:"<<(int)ch0<<endl;
return 0;
}

5.1.2 结果

1
2
3
结果:  
数字0的字符为: 数字0的大小为:0
字符0的字符为:0字符0的大小为:48

5.1.3 原因

说明:因为字符0的ASCII值为48,这实际上是将48这个值赋给ch,不过编译器会根据我们定义的char,自动将ASCII码值48转换为字符,这个转换过程是隐式的,我们看不到。

5.2 打印32到128之间的字符

5.2.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
using namespace std;

int main()
{
for(int i=32;i<128;i++)
{
cout<<(char)i;
}
return 0;
}

5.2.2 结果

1
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

5.3 特殊字符

5.3.1 代码

1
2
3
4
5
6
7
8
9
#include<iostream>
using namespace std;

int main() {
cout << "特殊字符";
char ch = '\t';
cout << ch << "特殊用途";
return 0;
}

5.3.2 结果

1
特殊字符	特殊用途

5.3.3 说明

  • '\t'的作用与按下键盘上的TAB键相同
  • 由于反斜杠''改变了其后字母的含义,因此它又叫做转义字符

5.3.4 延伸

  • '\t'可换成'\r'

六 特殊字符

特殊字符 含义
\a 铃声(警报声)
\b 回退
\f 换页
\n 换行
\r 回车
\t TAB键
\v 垂直制表
\' 单引号
\" 双引号
? 问号
\\ 反斜杠
\000 八进制
\xhhh 十六进制