1. 在Win7 x64下编程产生的程序,可以是Win32(x86),可以是x64的,都能运行,在【任务管理器 -> 进程】页面上,Win32的程序会以*32标记;
2. 高版本的VC,如VS2008,若产生了x64的程序,实际上定义了宏【_WIN64】,_WIN64可以用来判断当前程序是编译在何版本上的一个有效标志。(注,无论在x86还是在x64平台上,_WIN32宏是一定被定义着的);
3. 使用64位的整数,在VC6下,可以使用__int64(前面两个下划线),占用8个字节,在高版本的VS下,既可以使用__int64,又可以使用long long来表达一个64位(其实内部实现还是__int64,见下面的typedef实现),支持基本的运算,如+、-、*、/等操作。
4. printf输出或格式化(CString.Format)时,使用下面方式:
printf("%I64d"),其中“I64”是修饰符号,后面的d是有符号的64位显示;类似的如“%I64x”,以16进制显示该整数,“%016I64x”,以16进制前面补零共16个占位符的方式显示该整数;“%I64u”是无符号的10进制显示。
反过来,将一个64位的整数字符串转换为数值,使用_strtoui64,该函数还支持16进制的字符串转换:
char str[100] = "10446744073709551615"; unsigned __int64 u =_strtoui64(str, NULL, 10); printf("10进制的字符串转换结果:\r\n"); printf( "u = %I64u\n", u ); printf( "u = 0x%I64x\n\n", u ); printf("16进制的字符串转换结果:\r\n"); strcpy(str, "0x90fa4a62c4dfffff"); u =_strtoui64(str, NULL, 16); printf( "u = %I64u\n", u ); printf( "u = 0x%I64x\n\n", u );
5. 64位编程还经常用到的一个数据联合结构:LARGE_INTEGER,经常用在驱动编程中,定义如下:
typedef union _LARGE_INTEGER { struct { DWORD LowPart; LONG HighPart; } ; struct { DWORD LowPart; LONG HighPart; } u; LONGLONG QuadPart; }LARGE_INTEGER, *PLARGE_INTEGER;
类似的64位数据类型:
typedef __int64 LONG64; typedef signed __int64 INT64; typedef unsigned __int64 ULONGLONG; typedef unsigned __int64 DWORDLONG; typedef unsigned __int64 ULONG64; typedef unsigned __int64 DWORD64; typedef unsigned __int64 UINT64;
6. 在64位编译环境下,指针类型占用8字节:
#ifdef _WIN64 printf("64位版本\r\n"); printf("DWORD64 = %d\r\n", sizeof(DWORD64)); //8 printf("HANDLE = %d\r\n", sizeof(HANDLE )); //8 printf("LONGLONG = %d\r\n", sizeof(LONGLONG)); //8 printf("char * = %d\r\n", sizeof(char *)); //8 printf("LARGE_INTEGER = %d\r\n", sizeof(LARGE_INTEGER)); //8 #else printf("32位版本\r\n"); printf("DWORD64 = %d\r\n", sizeof(DWORD64)); //8 printf("HANDLE = %d\r\n", sizeof(HANDLE )); //4 printf("LONGLONG = %d\r\n", sizeof(LONGLONG)); //8 printf("char * = %d\r\n", sizeof(char *)); //4 printf("LARGE_INTEGER = %d\r\n", sizeof(LARGE_INTEGER)); //8 #endif