C++ 困惑 C++ 困惑
代码如下wchar_t c='a', d='爱';
cout<<char (c)<<endl<<wchar_t (d)<<endl;
为什么输出结果是
而不是
呢??????????
追问:在VC 6.0运行里运行得不到预期的结果
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的编码
回答完毕,敬请采纳