字符字面量

  • Post author:
  • Post category:其他




一、字符型字面量和ASCII码表

字符字面量实际上是整数类型,单引号引起的字符(至少1个、至多4个)

单字符字面量:‘a’、‘b’、’\n’等

多字符字面量:‘abcd’等

对于单字符字面量,实际上被编译器识别为int类型。例如,’a’这样一个单字符字面量实际被识别为int类型的97,这和直接写整数字面量97是没有区别的。

每个字符被识别为哪个整数值这是由编码表决定的,也就是规定了每个字符所对应的整数值的对应表。通常使用的是ASCII码表,它包含了大小写字母和英文标点以及一些控制字符所对应的整数数值。其中总共有128个可显示字符和控制字符,也就是使用0-127这128个整数与这些字符一一对应。显然,表示128个整数实际上只需要7个二进制位,考虑到计算机按字节编址、寻址所以通常用1个字节保存这个整数(最高位都是0)。

但一个单字符字面量的识别类型并不是整数类型char而是int,这并不影响存储空间,因为字面量识别类型的二进制串不一定就是实际存储时的二进制串。由于int类型可以向char类型变量赋值,高位被截断丢弃这并不影响变量保存最低一个字节。

通常将但字符字面量赋值给char类型变量,但这并不是必须的。因为单字符字面量实际上被识别为int类型,它能和int类型的整数字面量一样使用。因此可以将一个单字符字面量赋值给任何整数类型的变量当作一个普通整数使用。显然,这样不如直接使用一个char类型变量节省内存。

ASCII码表中既包含了可显示字符也包含了不可显示的控制字符。其中可显示字符可以直接在显示器输出、通过标准键盘输入对应的图形符号,控制字符则不能直接输入和在屏幕显示。具体的ASCII码表可以参考:

ASCII码表


所有的ASCII码可以直接按照**]\x对应十六进制整数值**的形式使用,如下的方式是等价的:

char c = 'a';
char c = '\x61';

对于一些常用的非显示字符也提供了简写的转义字符形式直接使用:

在这里插入图片描述



二、中文和其他字符

ASCII码表只提供了包含英文字母英文标点的128个常用字符,中文并不在此范围内。

我们可以按单引号单个汉字的形式使用中文字符,这种字面量也被识别为int类型,但一个中文字符只需要低两个字节。如果为了使用单个中文字符的字面量,可以使用short类型的变量存储。但是,这样就不能和ASCII码字符统一起来,如果是混合了中文和ASCII码的字符串就不容易处理。通常可以使用int类型变量统一存储中文字符和ASCII字符。此时ASCII码使用的仍是0-127,而中文字符使用的都是负数值。

例如:

short c = '中'; // 0xD6D0 int值为-10544



三、多字符字面量

单引号中至少一个ASCII码字符,至多4个ASCII字符(或者至多两个中文字符)。实际上,一个ASCII码字符认为是1个字节,一个中文字符认为是2个字节。一个单引号中所有字符的字节数应该大于0不超过4。

多个字符字面量也被是被为int类型,其值可以看作其中几个字符的二进制串的拼接,例如:

// a:0x61
// b:0x62
// 中:0xD6D0
int c = 'ab中'; // 0x6162D6D0

如果单引号中字符不足4个字节,则会在高位补0。

无论是但字符字面量还是多字符字面量实际上都当作整数使用,整数的一些规则都适用于字符型字面量。更确切地说,并不存在字符类型,即使是char也是整数类型。只是对于这些字符,我们通常不关心它的整数值而是使用它的字符来表示一些有意义的文本数据。



版权声明:本文为zhlijin2020原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。