鱼C论坛

 找回密码
 立即注册
查看: 1558|回复: 0

[学习笔记] 《WINDOWS程序设计》(022)2.2 宽字符和C语言-2.2.2 更宽的字符

[复制链接]
发表于 2018-10-23 14:32:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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++中的调试,结果符合书中所述情况】)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 08:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表