C++中单引号引出字符/字符串的输出

之前在复习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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值