首页 文章

移植32位到64位代码

提问于
浏览
0

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

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

从指针转换为不同大小的整数[-Werror = pointer-to-int-cast] for

x = (int32_t)y;

为了得到这个,我使用x =(size_t)y;我摆脱了错误,但这是正确的方法 . 同样在不同的位置我必须将变量强制转换为(unsigned long long) . 例如

printf("Total Time   : %5qu\n",time->compile_time

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

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

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

这又是否合适?

2 回答

  • 2

    我认为在这种情况下假设 y 是一个指针是安全的 .

    而不是 size_t ,你应该使用 intptr_tuintptr_t .

    size_t vs. uintptr_t .

    至于你的第二次演员,取决于你的意思是什么?

    通常的建议是避免施法 . 然而,就像编程中的所有内容一样,它们是可用的 . 在嵌入式系统上处理 malloc 的实现时,我必须将指针转换为 uintptr_t ,以便能够对它们进行必要的算术运算 . 此代码在64位PC上进行了测试,但在32位微控制器上运行 . 我使用两种体系结构的事实是确保它是一些可移植代码的最佳方法 .

    但是,强制转换会使您的代码依赖于底层类型的定义方式!就像你注意到 x = (int32_t)y 这一行一样,你的代码依赖于指针是32位宽的事实 .

    我能给你的唯一建议是了解你的类型 . 如果你想要强制转换,那就没关系(只要你不能开始使用正确类型的变量),但它可能会降低你的可移植性,除非你选择要转换为“正确”的类型 .

    对于 printf 演员来说也是如此 . 如果我是你,我会首先彻底阅读 %5qu 的定义(this may help) . 然后我会尝试使用一个适当类型的变量(或相反地使用不同的格式字符串),并且只有在失败时才会使用强制转换 .

    我从来没有使用 %qu 但我会将其解释为64位无符号整数,因此我会尝试使用 uint64_t (因为 long long 并不保证在所有平台上都是64位) . 虽然通过我在维基百科上阅读的内容, q 说明符是特定于平台的,所以改变它可能是明智之举 .

    除此之外,问题变得过于宽泛(我们坚持特定的例子是好的) . 如果您遇到困难,请返回您要检查的个别类型,并仅询问有关它们的问题 .

  • 1

    是Stroustrup说他们称之为'演员',因为它支持了一些破碎的东西吗? ;-)

    x = (int32_t) y;
    

    在这种情况下,您使用的是精确宽度类型,因此它实际上取决于x和y是什么 . 错误消息表明y是一个指针 . 指针不是int32_t,所以真正的问题是为什么y被分配给x ...它可能表示潜在的问题 . 将其抛弃可能只是为了解决问题,因此它会在运行时而不是编译时咬你 . 弄清楚代码认为它正在做什么,并“重新启动”类型以适应代码 . 使用(size_t)强制转换时错误消失的原因是指针可能是64位而size_t是64位,但你可以认为这是一种随意铸造运气的简单形式 . 当转换为(unsigned long long)时也是如此 . 不要假设int是32位或64位并且不使用强制转换作为移植工具......它会让你遇到麻烦 . 基于单行代码更具体是很难的 . 如果你想发布一个有问题的<25行功能;可能会提供更具体的建议 .

相关问题