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 _WIN64printf("64位版本\r\n");printf("DWORD64 = %d\r\n", sizeof(DWORD64)); //8printf("HANDLE = %d\r\n", sizeof(HANDLE )); //8printf("LONGLONG = %d\r\n", sizeof(LONGLONG)); //8printf("char * = %d\r\n", sizeof(char *)); //8printf("LARGE_INTEGER = %d\r\n", sizeof(LARGE_INTEGER)); //8
#else printf("32位版本\r\n");printf("DWORD64 = %d\r\n", sizeof(DWORD64)); //8printf("HANDLE = %d\r\n", sizeof(HANDLE )); //4printf("LONGLONG = %d\r\n", sizeof(LONGLONG)); //8printf("char * = %d\r\n", sizeof(char *)); //4printf("LARGE_INTEGER = %d\r\n", sizeof(LARGE_INTEGER)); //8
#endif
小结:无论是在x86,还是在x64上,最快最简单的办法是直接使用__int64类型来表达64位的数据。
VC(VS)的64位编程小结相关推荐
- 32位架构应用转64位架构小结
64位应用适配 ##简介 同桌面系统架构一样,苹果公司从 iOS 7 开始采用64位的A7处理器.在相同的设备上,运行相同的应用,支持64位的应用比支持32位的应用性能更高. 苹果公司的A7处理器支持 ...
- vc++l调用64位的mysql_VC++2010配置使用MySQL5.6
0.前提 安装后的文件概览 编译器: VC++2010 MySQL版本:MySQL5.6.19 for win64 Connector版本:connector c++ 1.1.3 在VS2010 ...
- win32,win64编程永恒;语言编程需要注意的64位
win32,win64编程永恒;语言编程需要注意的64位和32机器的区别 作者:拳拳的Blog | 出处:博客园 | 2011/12/10 7:17:51 | 阅读 79次 一.数据类型特别是int相 ...
- 【转】将 Linux 应用程序移植到 64 位系统上
原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...
- 64位进程调用32位dll的解决方法
最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...
- linux 64位内存划分,linux 64位内存空间大小?(linux 64 bits memory space size? [closed])
linux 64位内存空间大小?(linux 64 bits memory space size? [closed]) 在Linux 32bit中,内核占用1GB的内存,而用户空间将占用剩余的gigs ...
- 32位和64位系统对于程序员的影响
win32,win64编程永恒;语言编程需要注意的64位和32机器的区别 一.数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C99标准并不规定具体数据类型的长度大小,只规定级别.作下比 ...
- 64位和32位有什么区别?到底哪个更快?——硬核科普
原文链接:联想商用服务----64位和32位有什么区别?到底哪个更快?--硬核科普 32位和64位到底指什么? 下载 Windows 操作系统,会区分 X 64 和 X 86 版本(一般 X 86 是 ...
最新文章
- 浅谈 Kubernetes 中的服务发现
- 计算机系统的分类与发展方向
- 6个座位办公室最佳位置_一天中6个最佳的护肤时间,你知道几个?
- [BOI2007] Mokia
- Verizon部署美国最大小型基站系统
- mnist数据集读取并保存为Numpy数组
- Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出...
- solve stiffness matrix in matlab
- 相机标定-opencv
- 帆软自定义登录html,自定义登陆界面- FineReport帮助文档|报表开发|报表使用|学习教程...
- 迅雷边下边看实现过程分析
- java 发微信视频_分享java微信开发视频
- c++构造函数的定义
- 离职半年了,老东家又发 offer,回不回?
- 国庆假期看了一系列图像分割Unet、DeepLabv3+改进期刊论文,总结了一些改进创新的技巧
- oracle wallet相关的bug|oracle wallet使用注意事项|ORA-28374: typed master key not found in wa
- strtok和strtok_s函数使用说明
- 帝国时代2决定版多人游戏服务器维护,帝国时代2决定版联机网络差解决办法
- C++: 计算累积密度函数 (CDF) 非中心Beta分布(附完整源码)
- 关于新版微信内核x5问题