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实现),支持基本的运算,如+、-、*、/等操作。
运算时特别小心,最好写这样的代码:
__int64 x = 10446744073709551615; //不要在这一行上做运算
x -= 100;
printf("%I64u\r\n", x);
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;
直接使用成员QuadPart,像上面说的一样使用即可,因为Windows的头文件中这样定义的:typedef __int64 LONGLONG;(__int64的前面是两个下划线)
类似的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
小结:无论是在x86,还是在x64上,最快最简单的办法是直接使用__int64类型来表达64位的数据。