# 1char与字符的关系##1.1char类型到底代表什么提到char类型,我相信学过C/C++的并不会陌生,char类型代表一个字节,在内存中有8位,所以signed char的范围为-128~127,unsigned char的范围为0~255。不过C++中的char到底真的指这个么?在这之前,首先需要明白位和字节的概念。##1.2位和字节在计算机中,通常8位代表1个字节,即1byte=8bits,然而C++对于字节的定义与此不同,这或许跟我们熟知的8bit代表1字节截然不同。C++对字节的定义是至少能够容纳实现的基本字符集的相邻位组成,也就是说可能取值的范围至少大于等于字符数目,而我们目前熟知的ASCII码以及EBDCIC码用8位组合足以表示,在这种字符集系统上C++的字节确实是8位,然而在国际编程中采用更大的字符集比如Unicode等时,8位组合无法表示所有字符,因此一个字节可能需要16位甚至更多,在这种系统上,C++中的一个字节可能就不是代表8bit了,这是C++对字节的定义,这里我们一定不能搞混淆了。只有在常见的ASCII码等字符集上才是如此,一个char用8位表示。##1.3什么是字符集字符集是多个字符的集合,比如数字,字母,符号等,比如有常见的ASCII码,它是由美国ANSI制定的,包括常见的数字,字母等等,它通过8位二进制数来表示某个字符,比如字符‘A’,它的10进制数是65,16进制数是0x41,我们用UE打开1个文本文件,通过16进制视图可以清晰的看到‘A’的值是0x41,而‘0’的10进制数是48,它在16进制数中是0x30。这里的10进制数和16进制数代表什么意思呢?其实不管是字母还是数字还是其它看起来奇奇怪怪的符号,在二进制中都是存储在一个字节中,也就是8位。我们所看到的‘A’其实在内存中表示的数据为01000001,而这块内存数据如果被解释为整数,那就是65,如果是16进制数,那就是0x41,下面来看两个定义,这两条定义是否等价?char score =65;char score=‘A’;答案是仅在ASCII码编码系统上才有效,因为‘A’在ASCII码编码方式中它的10进制就是65,所以两者等效,而如果在其它编码方式中的‘A’换成了87,那么65就可能表示的是其它字符而不是‘A’了,因此需要根据系统采用的字符集来定,这里我们都采用ASCII码。至于其它例如EBCDIC,Unicode等编码方式如果有兴趣继续了解的话可以自行参考其它相关资料。
#2C++中的char##2.1如何表示char正如上面写到的,char代表一个字符,其实就是把内存中的某些二进制组合代表某个字符。声明某个字符的时候可以使用char,unsigned char 或者signed char,字符用单引号括起来,且单引号内只能有1个字符,例如char a=‘b’;unsigned char b='\032';signed char c='\n';C++中的char并不指明这个char是signed的,这点和int、long等其它整型不同,例如int、long等如果不带unsigned则默认表示属于signed。
对于第一种定义方式直接指明变量a是字符‘b’,变量b则通过‘\032’定义为8进制为032(10进制就是26)的字符也就是Ctrl+Z这个字符,变量c通过转义字符定义为换行字符。如果将char用作数值类型,unsigned char可以表示0~255,而signed char只能表示-128~127,如果要用1个char存储200,那么有些系统可以这样做,而有些不可以。但是unsigned char都可以,因为它可以表示到255。另一方面,如果是存储ASCII码字符,则有没有符号都没关系,直接用char即可。可以看到我们在定义字符的时候无论通过直接字符赋值还是用其8进制,10进制,16进制等都可以。其中10进制数可以直接赋值,而8进制,16进制,转义字符等需要用‘’括起来并在前面加转义序列\才行。不过尽量推荐在可以同时使用数字转义序列和符号转义序列时采用符号转义序列,因为数字表示与特定编码方式有关,而符号表示适用于任何编码方式。##2.2通用字符名C++除了允许基本的源字符集外,还允许提供扩展的源字符集以及执行字符集,比如德国的日耳曼元音变音等等。C++有这样一种表示特殊字符字符的机制,它独立于任何特定的键盘,使用的是通用字符名。
通用字符名的用法类似于转义序列。可以以\u或者\U大头。\u后面跟4个16进制数,\U后面跟8个16进制数。这些位表示的是ISO 10646的码点。这些扩展字符可以在标识名或者字符串中使用,例如:int k\u00F6rper;cout<<"Let them eat g\u00F6teau.\n";其中\u00F6表示的字符是Ö,那么第一个it变量就是kÖrper,第2个变量字符串打印出来则是Let them eat gÖteau.如果系统不支付ISO 10646,则无法打印出上述的字符。C++使用通用编码名是因为应将\u00F6解释为Unicode码点为U-00F6的字符。支持Unicode的编译器会知道这表示字符Ö,但无需使用内部编码00F6,在不同的系统中该字符的编码可能不同。在源代码中可使用适用于所有系统的通用编码名,而编译器将根据当前系统使用合适的内部编码表示它。补充:Unicode编码提供了一种表示各字符集的解决方案,ASCII码只是其一个子集,Unicode还包括很多拉丁字符,象形文字等。到目前为止,其可以表示10万多个符号和90多个手写符号并在不断发展。Unicode给每个字符指定了一个编码-码点,比如U-222B,U表示这是一个Unicode字符,而222B是该字符(积分正弦符号)的码点。ISO建立了1个小组开发ISO 10646,这也是一个对多种语言文本进行编码的标准。#2.3wchar_t前面已经介绍过字符集了,那么程序处理的字符集可能无法用1个8位的字节表示,比如日文汉字系统。对于这种情况,C++处理方式有两种:第一,编译器厂商把char定义为16位的字节甚至更大,第二,可以同时支持小型基本字符集和较大的扩展字符集。8位的char表示基本字符集,而wchar_t(宽字符类型)表示扩展字符集。wchar_t是一种整数类型,有足够大的空间表示系统使用的最大扩展字符集,依据底层系统来实现,在一个系统中可能是unsigned short,在另外一个系统中可能是int。定义一个wchar_t类型的字符时,需要在字符前面加上前缀L,比如:wchar_t name=L'l';而在C++中用cin,cout进行输入输出时,无法处理wchar_t类型,因为它们把输入输出当成char流,需要采用wcin和wcout,比如输出宽字符串:wcout<<L"xixi"<<endl;##2.4C++11新增的char16_t和char32_t随着Unicode的发展,wchar_t也不能满足需求了,并且在计算机上进行字符和字符串编码时,仅使用Unicode码点并不够。C++11标准新增了两个新增的类型,char16_t和char32_t,前者长16位,后者长32位,并且都是无符号类型。C++11中使用小写u前缀表示char16_t字符常量或者字符串常量,使用大写U前缀表示char32_t字符常量或者字符串常量,u或者U前缀指明该字符的类型为char16_t还是char32_t,比如:char16_t ch1=u'q';char32_t cha2=U"\U0000022B";

C++中char类型详解相关推荐

  1. C++中size_type类型详解

    介绍 是和string类类型和vector类类型定义相关的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型 string抽象意义是字 ...

  2. [转载] java 中 date类型详解

    参考链接: Java中的date after()方法 举例: Date的after和before方法解释 Date1.after(Date2),当Date1大于Date2时,返回TRUE,当小于等于时 ...

  3. linux+nm+内容详解,【Linux】nm命令中符号类型详解

    DATE: 2018.11.13 nm命令介绍的很多,但大多不介绍其函数符号标志的含义. 最近在调试动态库时常用到,其中用的最多的用法: nm -A * |grep "aaa" | ...

  4. nm命令中符号类型详解

    nm命令介绍的很多,但大多不介绍其函数符号标志的含义. 最近在调试动态库时常用到,其中用的最多的用法: nm -A * |grep "aaa" | c++filt  // -A 为 ...

  5. MATLAB中逻辑类型详解

    逻辑类型 Matlab中存储逻辑变量的类型有两种,为true和false,分别由1和0来表示. 函数logical() 可以将任何非零的数值转化为true,将数值0转化为false. a=3;b=0; ...

  6. 最新Java中Date类型详解

    一.Date类型的初始化 1. Date(int year, int month, int date); 直接写入年份是得不到正确的结果的. 因为java中Date是从1900年开始算的,所以前面的第 ...

  7. java中枚举类型详解

    枚举类型的引入: 枚举是从java5开始提供的一种新的数据类型,是一个特殊的类,就是固定的多个常量对象的集合. 定义格式: [修饰]enum 枚举类名 { 常量A,常量B,常量C; } 代码: pac ...

  8. redis中list类型详解及常用命令

    redis中的list类型有点类似于编程语言中的数组,list类型如下图所示,实际上是一种双向链表结构,通过lpush.lpop.rpush.rpop这几个命令来控制链表中数据出入,所以list类型可 ...

  9. MySQL中int类型详解

    这个代表显示宽度 整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节. int是整型 ...

最新文章

  1. java批量执行sql语句_Java中批量执行sql语句
  2. 如何快速坐地铁高铁?舒工为您带来满满的都是干货~
  3. Tomat启动自动运行一个类
  4. java7 离线_java7 64位
  5. 关于isset的一点说明
  6. oracle 查询各科前3名_2020年山东高校排行榜前3无悬念,山东理工大学省内第17全国250名...
  7. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍--转载
  8. Spring Mvc返回html页面404错误解决记录--转载
  9. CentOS7升级Python2.7.5至2.7.13版本
  10. 15. 三数之和 golang
  11. 农村金融大变革,央行要给农民发钱了!
  12. GDAL工具使用示例(一)
  13. unity C#计时器,记录程序运行时长
  14. 人脸照片不规范、如何更改?pupiIDistanceTooSmall 错误
  15. 光电编码器的原理及应用场合_光电编码器的原理及应用电路
  16. word计算机相乘公式,怎么使用Word复制乘积公式
  17. php订单表设计,订单详情表,与,订单表 怎么做?
  18. 文笔很差系列4 - Kris Kremo
  19. 【职场必备知识】毕业留蓉政策与发展前景分析
  20. 手机号归属地数据导入及查询工具源代码(C++)

热门文章

  1. AutoESL与Xilinx那些人和事
  2. 计算机内部的物理运行机制,许多人具有应用物理、计算机、经济、心理学以及运筹学的背景,因...
  3. 【Python爬虫】2022年数学建模美赛B题数据爬取
  4. “宅米”VS“校呵呵”竞品分析报告
  5. .net core 上传excel文件
  6. Dynamics 365 你所期待的子网格编辑终于来了
  7. Office 365实现多人在线编辑同一个文档(下)
  8. 数据分析基础篇---统计学基础
  9. 有道词典Android客户端包体积优化之路
  10. 2021年人工智能(AI)的五大发展方向