将32位代码向64位平台移植

来源:互联网 发布:java类库手册 编辑:程序博客网 时间:2024/04/29 22:54

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数据模型下时,都会出现不同的问题,而且很难找出原因所在。

char *a[20];char *p = a;int i = (int)p;printf("i = %p, p = %p\n", i, p);

32位移植到64位时,会出现截断的情况。
因此要注意指针类型的使用,尽量类型对应类型的使用,
尽量减少将指针类型强转成int类型之类的,会产生截断。
另外还有其他指针计算时,使用sizeof,尽量使用指针长度用4或8来运算的。

0 0
原创粉丝点击