简单的32到64位转换?

时间:2011-06-29 22:59:18

标签: c 32bit-64bit

有一种简单的方法可以将32位C代码编译成64位应用程序,只需要很少的修改吗?代码未设置为使用固定类型大小。

我对利用64位内存寻址不感兴趣。我只需要编译成64位二进制文​​件,同时保持4个字节的长度和指针。

类似的东西:

#define long int32_t

但是,当然会打破一些长期使用案例并且不会处理指针。我认为这里可能有一些标准程序。

3 个答案:

答案 0 :(得分:3)

似乎有两个正交的“便携性”概念:

  1. 我的代码开箱即用。它的一般行为在所有平台上都是相同的,但可用功能的细节因平台的特性而异。

  2. 我的代码包含一个依赖于体系结构的文件夹。无论如何,我保证MYINT32总是32位。我成功地将32位的概念移植到火星的九指毛茸茸的lummoxes。

  3. 在第一种方法中,我们编写unsigned int n;printf("%u", n),我们知道代码始终有效,但unsigned int的数字范围等详细信息取决于平台,而不是我们的关注。 (Wchar_t也在这里。)这就是我称之为真正的便携式风格。

    在第二种方法中,我们输入所有内容并使用类似uint32_t的类型。带有printf的格式化输出会触发大量警告,我们必须求助于像PRI32这样的怪物。在这种方法中,我们从知道我们的整数总是32位宽来获得奇怪的权力和控制感,但我不愿称之为“便携式” - 它只是顽固。

    需要特定表示的基本概念是序列化:您在一个平台上编写的文档应该在所有其他平台上可读。序列化很自然地放弃了类型系统,必须担心字节序,需要决定固定表示(包括文本编码等)。

    结果就是:

    • 使用标准语言原语以便携式样式编写主程序核心。
    • 编写定义良好,干净的I / O接口以进行序列化。

    如果您坚持这一点,您甚至不应该考虑您的平台是32位还是64位,大端还是小端,Mac或PC,Windows或Linux。坚持标准,标准将坚持你。

答案 1 :(得分:2)

不,一般来说,这不可能。例如,考虑malloc()。当它返回一个无法用32位表示的指针值时会发生什么?如何将该指针值作为32位值传递给您的代码,在取消引用时可以正常工作?

这只是一个例子 - 还有许多其他相似的例子。

编写良好的C代码本质上不是“32位”或“64位” - 它在重新编译为64位二进制文​​件时应该可以正常工作,无需进行任何修改。


您的实际问题是要将32位库加载到64位应用程序中。一种方法是编写一个32位辅助应用程序来加载你的32位库,以及一个加载到64位应用程序中的64位填充程序库。您的64位填充程序库使用某种IPC机制与您的32位帮助程序进行通信,请求帮助程序应用程序代表它执行操作,并返回结果。

特定情况 - 一个Matlab MEX文件 - 可能有点复杂(你需要双向函数调用,这样64位填充程序库可以代表32位执行mexGetVariable()之类的调用帮助者),但它应该仍然可行。

答案 2 :(得分:0)

可能会咬你的一个区域是你的32位整数中的任何一个是否按位操作。如果您假设某些状态标志存储在32位寄存器中(例如),或者您正在进行位移,那么您将需要关注那些。

另一个值得关注的地方是任何网络代码,它假设在线路上传递的整数的大小(和字节序)。一旦那些被转移到64位整数,你需要确保你没有丢失符号位或精度。

包含整数的结构将不再具有相同的大小。任何关于尺寸和对齐的假设都需要清理干净。

相关问题