将32位代码向64位平台移植
2015-11-02 19:36
218 查看
2015-11-2 16:09:53 周一
将32位代码向64位平台移植,怎么弄?
是不是只要将32位的代码重新编译成64位的二进制可执行文件就行了吗?
32位跟64位程序有什么不一样的?
32位环境涉及”ILP32”数据模型,是因为C数据类型为32位的int、long、指针。而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作”LP64”数据模型。
现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型,除了指针是64位,其他基本类型都没有变。在此主要探讨ILP32到LP64的移植问题。
c语言数据模型ILP32、LP64的对比:
向64位移植代码时的所有问题差不多都可以总结出一个简单的规律:
不能把int、long、指针的长度一样。如何违反这条规律的代码,当运行在LP64数据模型下时,都会出现不同的问题,而且很难找出原因所在。
32位移植到64位时,会出现截断的情况。
因此要注意指针类型的使用,尽量类型对应类型的使用,
尽量减少将指针类型强转成int类型之类的,会产生截断。
另外还有其他指针计算时,使用sizeof,尽量使用指针长度用4或8来运算的。
将32位代码向64位平台移植,怎么弄?
是不是只要将32位的代码重新编译成64位的二进制可执行文件就行了吗?
32位跟64位程序有什么不一样的?
32位环境涉及”ILP32”数据模型,是因为C数据类型为32位的int、long、指针。而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作”LP64”数据模型。
现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型,除了指针是64位,其他基本类型都没有变。在此主要探讨ILP32到LP64的移植问题。
c语言数据模型ILP32、LP64的对比:
向64位移植代码时的所有问题差不多都可以总结出一个简单的规律:
不能把int、long、指针的长度一样。如何违反这条规律的代码,当运行在LP64数据模型下时,都会出现不同的问题,而且很难找出原因所在。
char *a[20]; char *p = a; int i = (int)p; printf("i = %p, p = %p\n", i, p);
32位移植到64位时,会出现截断的情况。
因此要注意指针类型的使用,尽量类型对应类型的使用,
尽量减少将指针类型强转成int类型之类的,会产生截断。
另外还有其他指针计算时,使用sizeof,尽量使用指针长度用4或8来运算的。
相关文章推荐
- Java异常、事件、多线程
- Java安全技术
- Java数据库技术
- Java输入输出技术
- Matlab使用技巧
- spring中jdbc声明式事务和spring基于xmlschema、annotation的声明式事务(事务3)
- Qt小总结----QSplitter、QDockWidget、QToolBar、布局
- SpringDI_容器依赖注入的注解
- 几个 str 库函数源代码
- C++11新版本
- Spring MVC 教程,快速入门,深入分析
- Spring @Transactional 如何开启事务
- torch.gt函数的用法
- Spark(Hive) SQL中UDF的使用(Python)
- 2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示
- C++ 宏定义动态加载、工厂模式
- ubuntu安装配置jdk
- AbstractList 抽象类 源代码
- 判断一个字符串是否为另一个字符串旋转之后的字符串
- 利用C++优势快速打完最长不下降子序列