当前位置:编程学习 > C/C++ >>

C++ 困惑 C++ 困惑

代码如下

wchar_t c='a', d='爱';
cout<<char (c)<<endl<<wchar_t (d)<<endl;

为什么输出结果是

而不是

呢??????????

追问:在VC 6.0运行里运行得不到预期的结果
答案:截图:

程序如下:

#include <iostream>
#include <locale>
using namespace std;

int main(void)
{
 setlocale(LC_ALL, "chs"); //要先配置地域化信息
 wchar_t c = 'a';
 wchar_t d = L'爱'; //赋值时需要标明时宽字符
 wcout << d << endl;
 system("PAUSE>NUL");
 return 0;
}

你肯定用得是多字节编码方式编译的

在C/C++中,wchar_t代表的是用两个字节来显示一个字符 单独使用单引号只代表一个字节,如果想采用宽字符得需要在前面加L 比如L'a'  L'爱'

而 'a' 代表的是一个字节表示a,那么你把一个字节的a放入wchar_t类型的变量c里面,'a'的编码是0x61,由于c是两个字节,所以c的编码是0x0061;

而你cout的时候将c截断为char类型,也就是截断高8位刚好等于0x61,所以能正常显示小写字符a.

接下来的就有点复杂了

字符'爱'有两种编码,一种是多字节,一种是UNICODE编码,由于你采用的是多字节,所以'爱'的编码为0xAEB0,

而这里刚才也说了 由于你没有在双引号前面加L 所以变量d只能得到0XAEB0的低八位,也就是0XB0;

而你在cout<<wchar_t (d)的时候,由于wchar_t类型会显示两个字节的内存数据,所以将要显示的两个内存数据的第一个内存内容为 d 也就是0XB0,那么第二个内存内容是什么呢?这个肯定是0XAE.为什么呢?因为INTEL架构的CPU,存放一个字(两个字节)的内容时,会采取"高高低低"原则,也就是高地址存放高位数据,低地址存放低位数据,所以其实'爱'的编码虽然为0XAEB0,而这个编码再内存中其实是以 B0 AE 这样的相反顺序存放的,而 B0AE 换算成十进制是多少呢?正是你屏幕上显示的45230

这下该明白为什么会出现这种"灵异现象"了吧,说得有点乱,希望你能看懂.其实了解了原理,稍微想一想就应该能明白的.

最后,分析了这么多,提供解决方法.其实开头也说过了 你使用wchar_t类型时,就必须在引号前面加L 或者使用MFC提供的宏_T('a');这样就可以兼容多字节以及UNICODE的编码

回答完毕,敬请采纳

上一个:C++学习网站
下一个:c++死循环问题

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,