PoEdu_Windows_Lesson02_数据类型和字符编码

来源:互联网 发布:java软件工程师资格证 编辑:程序博客网 时间:2024/05/29 09:23

Windows数据类型

1.学习了C/C++的数据类型,为什么还要学习Windows数据类型?

学这个,不是因为我们一定要用它,而是因为有可能微软的API的参数/返回值就是这个东西,是微软的SDK中的一些东西,所以要知道。

这事windows制定的一些标准,希望程序员按照他的标准来做,但是它的一些标准是与C++标准所背离的。它是对C语言中的基础数据类型进行了一次再包装。

不是对C++的数据类型进行再包装,是为了支持C语言,可以在minwindef.h中查看

2.windows的数据类型

HANDLE

其实就是一个void*类型,代表的是一个实体

BOOL
是拿一个int来做的(32位),用来代表true和false

BOOLEAN
占用8bit,用来代表true和false

BYTE

是一个unsigned char

BSTR

CHAR

8bit

DWORD

主要表示32位的数据,是一个unsigned long

DWORD_PTR

也是unsigned long,存储的是一个地址,但是不能不直接通过*取到值,还需要做一个强制转换,在内核里面用的多,用户态中比较少用到

所以DWORD和DWORD_PTR本质是一样的(都是一个unsigned long),DWORD_PTR 不是一个指针,它只是存储了一个地址。在32位系统下,内存地址值的长度是32位,64位系统下,是表示64位的地址值,这是为了兼容。

PDWORD_PTR才是一个指针,前缀为P

示例:

DWORD_PTR pNum=&num
*(int*)pNUm=100;

取值的时候需要先进行一个强转,成为一个指针之后才能做解引用操作

处理错误的机制

微软的错误返回机制是千变万化的,没有统一…

所以使用API的时候,必须要在MSDN中查它的错误是怎么返回的,勤查文档是一个好习惯

HCALL

是一个DWORD

HRESULT

是一个LONG,也会用来做返回值,有坑,遇到HRESULT一定要查文档

INT
是一个int

PINT

代表的是point int

LPINT

代表的是long point

与PINT本质上没区别,都是指针,都是4Byte

INT8
长度为8byte的整型

LMCSTR

LPWSTR、PWSTR

代表一个字符串,示例:

LPWSTR str=”hello”

WCHAR

16bit

PWCHAR/LPWCH/PWCH: 指针
LPCWCH/PCWCH const 指针
WCHAR wchar=L’w’; 代表一个字符

TCHAR

视情况不同而变

根据工程而定,如果工程是unincode编码,那么TCHAR=wchar_t,如果不是,那么TCHAR=char

编译器中设置字符集来改变

由WCHAR CHAR TCHAR引申出了很多的类型

LPCVOID

QWORD

64bit

SIZE_T

ULONG_PTR

STRING

是UCHAR,是一个窄字符,不是字符串,其实没啥用

UINT

ULONG_PTR

根据系统变换而变化长度、根据不同的工程配置发生变化

VOID

小结

各字面一般来说代表的意义:
L:long
P:point
W:宽(wide)
A:窄字符串
STR:字符串
C:const
Q:四倍

字符编码——宽字节和窄字节

char

窄字节 8bit,用来操作ASCII字符集中的字符会更方便

wchar_t

宽字节 16bit,用于操作Unicode的字符集,会更方便,在windows下编程都用宽字符集(wchar_t),原生也是wchar_t

使用函数wcslen

TCHAR是使用_tcslen

windows版本很多,所以一些API的参数是ASCII码的,用TCHAR可以让我们少费点脑筋去考虑宽字节和窄字节的问题,但是建议少用TCHAR,考虑到移植性,尽量使用C语言中的数据类型,宽字节就用wchar_t,窄字节就用char

字符集

ASCII字符集

255个字符

UTF字符集

UTF-8、UTF-16、UTF-32

由ISO(国际标准组织)制定出来的,包含了全世界所有的字符

UTF是一个大的标准,标准制定了所有的字符(包括外星字符)对应的数值,0-255是和ASCII重叠的(其它字符相当于是分区存放了,比如中文是在区间A-B,俄文是在区间B-C)

UTF是可变长的(最小是8bit)

只需要8bit的的时候,就不会用32bit去做,多用于网络传输,因为可以进行字符的压缩

UTF-16

windows用的就是UTF-16编码,因为现在已知的字符,用UTF-16正好显示完,从Vsita(WIN10)开始用UTF-16 ,win10之前是Unicode,其实是一样的东西,只是UTF-16多了一个可变长(但是其实16已经不用可变长了,因为16位已经差不多够用了,所以UTF-16和Unicode也可以认为是一样的)

1 0
原创粉丝点击