之前在复习C++时发现了一个问题,在C++中,如果有以下代码:
cout<<'好'<<endl;
编译不会报错,输出结果为47811。再查看'好'的大小:
cout<<sizeof('好')<<endl;
输出结果为4。
C++中采用的是GB2312编码方式,而实际结果与汉字占两个字节的言论不符。于是再测试如下代码:
char a[]="好";
cout<<sizeof(a)<<endl;
输出的结果为3。
也就是说在字符串中汉字是占用两个字符的(加上结束符'\0',一共大小是三字节)。经过上网搜索资料和个人的调试,发现C++中对于字符有这样的操作方式:
将用单引号引起的部分看做一个字符。如如果输入:
cout<<'ab'<<endl;
编译器是不会报错的,而是将'ab'看做为一个整体作为字符,输出的结果为24930。在C++内部是这样 运算的:a的ASC码是97,b的ASC码是98,经过运算97*256+98=24930。我认为,C++在处理用单引号 引出的多个字符时,用一个4字节大小的整数来表示。可以将上面所说的a看成是这个整体的高位,b看做是 低位,而256看做是权数(我猜想是由于ASC码中最多能表示255,就好比十进制中一位最大表示9,将10 作为权数一样。由此推出输出 '好' 时的机制。一个汉字是有两个字节表示的,每个字节范围在 161~255(-95~-1),于是编写如下代码设法输出汉字‘好’的编码。
char a[]="好";
cout<<int(a[0])<<int(a[1])<<endl;
输出的结果为-70-61,即‘好’的编码为256-70=186;256-61=195;即186 195;于是得出’好‘的最终 输出结果为186*256+195=47811。验证正确。
C++中貌似这种机制输出的大小不超过4字节,否则会溢出。如输入:
cout<<'东南大学'<<endl;
输出结果为-1259089497。
如果对汉字编码不太了解的童鞋可以参考 http://www.cppblog.com/jacky2019/archive/2007/11/01/35693.html