将 32 位端口代码移植到 64 位代码

porting 32 bit to 64bit code

本文关键字:代码      更新时间:2023-10-16

正在尝试将 32 位移植到 64 位代码我想知道在移植时是否有一些标准规则?

我在 64 位环境中编译我的代码,现在我遇到了一些错误,例如

从指针强制转换为不同大小的整数 [-Werror=指针到整数转换]

x = (int32_t)y;

为了得到这一点,我使用 x = (size_t)y;我摆脱了错误,但这是正确的方法。同样在不同的位置,我必须将变量转换为(无符号长长)。例如

printf("Total Time   : %5qun",time->compile_time

这会产生错误错误:格式"%qu"需要类型为"long long unsigned int"的参数,但参数 2 的类型为 (XYZ)。

为了解决这个问题,我做了类似的事情

 printf("Total Time   : %5qun",(unsigned long long) time->compile_time

这又合适吗?

我认为在这种情况下可以

安全地假设y是一个指针。

您应该使用intptr_tuintptr_t而不是size_t

请参阅size_t与uintptr_t。

至于你的第二个演员,这取决于你所说的正确是什么意思?

通常的建议是避免铸造。但是,就像编程中的所有内容一样,它们可用是有原因的。在嵌入式系统上实现malloc时,我必须投射指向uintptr_t的指针,以便能够对它们进行必要的算术运算。此代码在 64 位 PC 上进行了测试,但在 32 位微控制器上运行。事实上,我使用了两种架构,这是确保它是某种可移植代码的最佳方式。

不过,强制转换会使代码依赖于基础类型的定义方式!就像您在x = (int32_t)y上注意到的那样,这一行使您的代码依赖于指针为 32 位宽的事实。

我能给你的唯一建议就是了解你的类型。如果要强制转换,可以(只要一开始就不能使变量具有正确的类型),但它可能会降低可移植性,除非您选择要转换为的"正确"类型。

printf演员阵容也是如此。如果我是你,我会先彻底阅读%5qu的定义(这可能会有所帮助)。然后我会尝试使用适当类型的变量(或者相反,使用不同的格式字符串),只有当失败时,我才会求助于强制转换。

我从未使用过%qu但我会将其解释为 64 位无符号 int,所以我会尝试使用 uint64_t(因为long long不能保证在所有平台上都是 64 位)。尽管根据我在维基百科上阅读的内容,q说明符首先是特定于平台的,因此更改它可能是明智的。

除此之外,问题变得过于宽泛(我们坚持使用具体的例子是件好事)。如果您遇到困难,请返回要检查的单个类型,并仅询问有关它们的问题。

Stroustrup说他们称之为"演员",因为它支撑着破碎的东西吗?;-)

 x = (int32_t) y;

在这种情况下,您使用的是精确的宽度类型,因此它实际上取决于 x 和 y 是什么。 错误消息表明 y 是一个指针。 指针不是int32_t,所以真正的问题是为什么 y 被分配给 x ...这可能表示存在潜在问题。 丢弃它可能只是掩盖了问题,以便它在运行时而不是编译时咬你。 弄清楚代码认为它在做什么,并"重新跳汰"类型以适应代码。 使用 (size_t) 强制转换时错误消失的原因是指针可能是 64 位,size_t是 64 位,但您可以认为这是一种简单的随机转换运气形式。 投射到(无符号长长)时也是如此。 不要假设 int 是 32 或 64 位,也不要使用强制转换作为移植工具......它会给你带来麻烦。 很难基于一行代码更具体。 如果要发布有问题的<25 行函数;可能提供更具体的建议。