详解char类型
文章目录
概述
char用来定义字符型变量,在内存中占1字节,范围是-128~127.
有以下两种存储方式:
-
将一个整型常量放到一个字符变量中,实际就是把以该整型常量表示的ASCII码放到内存单元中。(ASCII码是以十进制整数表示的)。
-
将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是把该字符的相应ASCII代码放到存储单元中。所以char可以直接转换成int
ASCII码简介
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:
-
0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;
-
ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
-
32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
-
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
-
128~255或者-128~-1代表扩展ASCII码,其中,-128对应128,依次递增对应。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。
同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。
赋值溢出
当赋值的内容超过一个字节时,系统会自动截取一个字节的内容给char变量,忽略其他的字节内容。
比如char a=’1234’;c++会认为单引号里的每一个数值都看做一个字符字面值,也就是说1 2 3 4各占一个字节,’1234’也就是一共占4个字节,然而char变量a只是占一个字节,初始化它的值却有4个字节,系统要从’1234’中截取一个字节 的内容给a,然而是截取’1’给a吗?不是,是把’4’给a。
因为在x86平台上,数据是以little-endian的形式排列的,低位字节放在内存的低地址,高位字节放在内存的高地址。我们看'1234’,从左到右从1到4,然而在计算机中存放的格式是从0x04到 0x01,就是说’1234’的低位4存放在计算机的内存低地址位,’1234’的高位1存放在内存的高地址位,所以当把’1234’给变量a时,系统把 内存中的地址中存放的4给a,其余的全部不要了。
再如:char b=’啊’;由于一个汉字是双字节的,系统会截取其中一个字节给char,但鬼才知道截取的那个字节是什么,所以cout«b时会出现乱码。
类型范围
在C语言中, signed char 类型的范围为-128~127,
但是为什么最小负数绝对值总比最大正数多1。这和补码的编码方式有关。
128的补码为10000000,占用了符号位,不能使用
-128的补码为(1)10000000,超出8位,也不能使用。
+0的补码为00000000,没问题。
-0的补码为10000000,没问题。
但是+0和-0表示的数值一样,所以可以将-0的编码形式赋予-128,这样可以多表示一个数字,而且-128的首位是1,也符合负数的规则。
举一个例子:
|
|
因为a默认为有符号的,所以当对a赋值254时,因为数值溢出,所以减去256,得到结果-2.
而当把a赋值给b时,会将a中的值取出来,而b是无符号的数,且是short类型,所以对于b,-1即65535,而-2为65534。
然后将b赋值给c,此时的b读出来是65534,将b赋值给c,则也为65534.
文章作者 Forz
上次更新 2017-06-24