|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
2.2.2 更宽的字符
使用Unicode字符或者是宽字符并不会改变C语言中的字符数据类型。char类型继续代表1个字节的存储空间,而且sizeof(char)继续返回1。理论上来说,C语言中的一个字节可能长于8位,但是对于大多数人来说,一个字节(因而就是一个char)是8位宽。(这句话到现在为止还是理解不够,模棱两可,似是而非)
C语言中的宽字符是基于wchar_t数据类型。这个数据类型被定义在多个头文件中,包括WCHAR.H,如下所示:
typedef unsigned short wchar_t;
因此,wchat_t数据类型和一个无符号短整型一样,都是16位宽。
可以用下面的语句来定义一个包含单个宽字符的变量:
wchar_t c = ‘A’;
变量C是一个两字节的值0x0041,这是Unicode中字母A的代表。(然而,因为Intel微处理器存储多字节数值时总是最低有效字节优先,所以这些字节实际上在内存是以这样的顺序存储的:0x41, 0x00。如果要检查Unicode文本的内存存储,请务必记住这点。)【经过在VC6.0++中的调试,用sizeof(wchar_t)的结果为2,sizeof(char)的结果为1;sizeof(c)的结果为2。】
还可以如下定义一个已初始化的指向宽字符的指针:
wchat_t *p = L”Hello!”;
注意,大写的字母L(表示长整型)紧接左引号。这向编译器表明这个字符串将用宽字符存储—也就是说,每个字符占用2个字节。指针变量p还是需要4个字节的存储空间,但是这个字符串需要14个字节—每个字符需要2个字节,再加上最后的0需要2个字节。【经过在VC6.0++中的调试,p为4个字节,其指向的字符串中每个字母均为2个字节,并包含了最尾端的0的2个字节】
同样,还可以如下定义一个宽字符的数组:
static wchar_t a[] = L”Hello!”;
这个字符串同样需要14个字节的存储空间,而且sizeof(a)也会返回14。你可以通过索引a数组来得到每个单独的字符。a[1]的值是宽字符’e’或0x0065。【经过在VC6.0++中的调试,结果符合书中所述情况】
虽然这看起来像是一个录入错误,引号之前的那个L是非常重要的,而且这两个符号之间绝对不能有空格。只有有了这个L,编译器才知道你想要字符串用每个字符两个字节的方式存储。之后,当我们看到在定义变量以外的地方使用宽字符串的时候,你会再次看到L后紧跟引号。幸运的是,如果忘记包括L,C编译器通常会显示一个警告或错误消息。
也可以在单个字符常量前面使用L前缀,如下所示,以表明它们应被解释为宽字符:
wchar_t c = ‘A’;
但这通常是不需要的。C编译器总是会在字符后面加0的。(【经过在VC6.0++中的调试,结果符合书中所述情况】)
|
|