.net是windows开发的自己的一门编程语言,微软在之前想开发一门语言来替代C/C++。
Windows制定了一些标准,希望绑架常程序员,从而统一C/C++……
Windows Data Types:
1:Data Type:在windef.h里面找,这些类型是Windows自己定义的,很多都是一样的,只是换了个写法。2:微软做了很多宏,结构体等,制订了很多数据类型(上百个),都是对C语言的基础数据类型进行包装。只能是在Windows下编程的时候才能使用这些类型。都是非标准数据类型,只是微软SDK里面的数据类型。微软是对C语言进行包装是为了支持C语言。
3:typedef可以对一个数据类型有多个命名:typedef unsigned char BYTE, *pTYPE;
4:BYTE WORD DWORD QWORD分别为无符号8,16,32,64位。DWORD和DWORD_PTR都是unsigned long。但一个表示32位,一个表示32位地址值。所有带PTR的都是指指针地址。是用来装地址值的类型。在64位系统下,DWORD_PTR就变成64位。
5: windows数据类型命名:
L:long(far)
N:near(near):16位中用的较多。
P: pointerC: const
W:宽字节
CH:char的简写,代表字符
STR:string简写,代表字符串T:代表宏 _T(一个兼容的宏,自适应UNICODE编码和其他编码)
数据类型:
bit:位,代表一位。
byte:8-bit,代表8位。
__INT8:8位的int型,范围为(-128~127)。
__INT16:16位的int类型,范围为(-32768~32767)。
__INT32:32位的int类型,范围为(-214783648~214783647)。
__INT64:64位的int类型,范围为(-9223372036854775808~9223372036854775807)。
wchar_t:宽字节,UNICODE编码字符。
__INT3264:在32位下就是32位,64位下为64位。
BOOL:32位的,1为真,0为假。
BOOLEAN:8位的,1为真,0为假。
BSTR:就是WCHAR*。
BYTE:就是unsigned char。
CHAR:就是char。
DOUBLE:就是double。
DWORD:定义为unsigned long。
DWORD_PTR:就是ULONG_PTR(unsigned long),所有带PTR的数据类型都是表示32位的地址值(会自动适应系统,不一定一直是32位,可能是64位),装的是一个地址。
DWORD32:定义为unsigned int。
DWORD64:定义为unsigned __int64
error_status_t:错误状态类型,就是unsigned long。微软的错误返回机制是千变万化的(返回类型都不一样),最好通过GetLastError来获取。
FLOAT:就是float。
HANDLE:句柄类型,定义为void*。
TCHAR,与工程有关,工程为unicode编码,TCHAR就是wchar_t,ansi编码则为char
HCALL:定义为DWORD。
HRESULT:会用来表示返回值,实际类型是LONG。
INT:32位的int,就是定义为int。
INT8:8位int,定义为char。
INT16:16位int类型,定义为short。
INT32:就是定义为int。
INT64:64位int,定义为 __int64。
LMCSTR:被定义为const wchar_t*。
LMSTR:被定义为wchar_t*。
LONG:定义为long。
LONGLONG:定义为__int64。
LONG_PTR:长整型的地址值。
LONG32:被定义为int。
LONG64:被定义为__int64。
LPCSTR:被定义为const char*。
LPVOID:被定义为const void*。
LPCWSTR:被定义为const wchar_t*。
LPSTR:被定义为char*。
LPWSTR:被定义为wchar_t*。
QWORD:被定义为__int64。
SHORT:被定义为short。
SIZE_T:被定义为ULONG_PTR,与C++里面的size_t不一样。
STRING:被定义为UCHAR*。
UCHAR:被定义为unsigned char。
UINT:被定义为unsigned int。
UINT8:被定义为unsigned char。
UINT16:被定义为unsigned short。
UINT32:被定义为unsigned int。
UINT64:被定义为unsigned __int64。
ULONG:被定义为unsigned long。
ULONG_PTR:被定义为unsigned __int3264。
ULONG32:被定义为unsigned int。
ULONG64:被定义为unsigned __int64。
ULONGLONG:被定义为unsigned __int64。
UNICODE:被定义为wchar_t,后面已经被废弃了,不再使用。
USHORT:被定义为 unsigned short。
VOID:被定义为:void。
WCHAR:被定义为wchat_t。
字符集:
1:一个字节就是8bit,所谓的宽字节和窄字节,实际上只是一种叫法,是char和whar_t,窄字节宽字节这种叫法是不对的,我们只是用这个来表示意义。这就与字符集产生了关系。之前学的ASCII字符也称为ASCII字符集,只有255个。
2:UTF字符集包含了全世界所有的字符,UTF是一个大的标准,标准制订了所有字符(据说包括预留外星字符)的数值,0~255是和ASCII字符重合的,后面有分区。
UTF-8 表示字符最小单位是8位可变长字符集,只需要8位可以表示的时候,就用8位,多用于网络传输。UTF-16 是16位Windows用的就是UTF-16。目前全世界字符基本可以用UTF-16表示完。Windows从Vsita开始用的UTF-16,以前用的UNICODE编码,两者区别很少。
UTF-32 是32位,可以包含40多亿字符。
注意:如果所有字符都占用32位的话就会很浪费,所以就有UTF-8和UTF-16。需要多少byte可以表示就用多少表示,不浪费。这就是为什么UTF字符集有这三个版本。
3:微软提供了很多宽字符的字符串处理函数,C语言里面的字符串处理函数在宽字符集里面变得不再实用
#include <iostream>
#include <windows.h>
int main()
{
WCHAR ch = L'M';
LPWSTR str = L"ASDF";
char* str0 = "我爱Mark";
std::cout << strlen(str0) << " " << str0[0] << std::endl;//输出8
wchar_t *str1 = L"我爱Mark";
std::cout << wcslen(str1) << " " << str1[0] << std::endl;//输出6 25105
return 0;
}
4:UTF-16可以转化成UTF-8,UTF-8可以转化为UTF-32或UTF-16。都是可变长的。与UNICODE是一模一样的,只是UNICODE没有可变长这一说法。
5:GBK编码:以及一些其他的编码都已经慢慢退化,用的较少了,现在主流的是UTF编码。
6:使用宽字符集之后,很多C语言里面的字符串处理函数就没办法使用了,Windows提供了一些宽字符处理的函数。详见:http://blog.csdn.net/qq_31622605/article/details/71308377