VC(VS)的64位编程小结

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位的数据。















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值