【问题标题】:Will int32 be the same size on all platforms?int32 在所有平台上的大小都相同吗?
【发布时间】:2014-06-25 14:15:56
【问题描述】:

我正在使用 C++ 开发一个多平台应用程序(iOS、Android 等)。

C++ 标准中是否存在保证宽度固定且可跨多个平台移植的基本类型?

我正在寻找固定宽度的类型,例如 Int32、UInt32、Int16、UInt16、Float32 等。

【问题讨论】:

  • C++ 两者都没有。
  • 不过,一个int32_t。对于float,请参阅this
  • @dlf 可能int32_t。它并非出现在所有平台上。 (但真正的问题是:他为什么想要固定宽度的类型?几乎没有理由使用它们。)
  • 我读到即将发布的 android 版本将是 64 位的。新的 iOS 设备也是 64 位的(尽管只有少数数据类型具有不同的大小 - CGFloat、指针大小、长整数)。我正在编写我的第一个主要 C++ 项目,它是多平台的,我没有太多 C++ 经验,所以我的问题可能没有意义。 XP 我只是想提前计划一下,以防我发布应用后发生重大变化。
  • @JamesKanze:嵌入式系统,例如手机,可能需要位宽特定的数据类型。例如,我不相信 Android 操作系统会为 ADC(麦克风)提供 32 位 API。我没有看到任何超过 16 位的 ADC。

标签: c++


【解决方案1】:

int32是自定义typedef,默认只有int存在。如果您需要指定宽度,请查看stdint.h

#include <cstdint>

int32_t integer32bits;

我认为标准中不存在任何浮点对应项,如果我错了,请纠正我。

【讨论】:

  • 别忘了int32_t 是可选的,所以要回答这个问题,可能在所有平台上都不一样。可能所有包含它的大小都相同。
  • This question 解决浮动问题。
  • @chris 是的,虽然编译器错误比不同大小要好得多,但“在所有平台上都不一样”是一种误导。
  • 似乎只存在于C++11;如果 OP 需要支持特定的嵌入式平台,那些 typedef 可能还不存在。
  • @BTownTKD 在 C++98 AFAIK 中没有描述,但它在 C 中已经存在了一段时间,许多主要编译器都支持它作为语义与 C++11 版本相同的扩展。但是,是的,一些嵌入式工具链不支持它。虽然没有什么新东西,它一直是(并且将在很长一段时间内保持)可选,因此即使是完整的 C++11 工具链也可能会忽略它。
【解决方案2】:

浮点数几乎总是 32 位,除了一些不符合 IEEE 754 的晦涩平台。您很可能不需要为这些烦恼。整数类型可能会有所不同,但如果您的目标平台具有兼容 C++11 的编译器,那么您可以使用 cstdint 标头以标准方式访问特定大小的类型。如果您不能使用 C++11,那么您很可能需要为每个平台使用单独的代码。

【讨论】:

    【解决方案3】:

    &lt;stdint.h&gt;&lt;cstdint&gt; 中的定义可用于可移植性:

    • int32_t 保证是有符号 32 位类型的 typedef,或者根本不存在。由于这是 C++,您可以使用 enable_if 来决定行动方案。
    • int_least32_t 是至少有 32 位的最小类型的 typedef
    • int_fast32_t 是至少具有 32 位并且可以有效操作的类型的 typedef(例如,如果内存总线是 64 位宽并且不允许部分存储,则使用 64 位类型会更快,并且会浪费内存而不是而不是执行读-修改-写访问)

    另见The difference of int8_t, int_least8_t and int_fast8_t

    请注意,不同的系统也可以有不同的字节序,因此在网络上传输这些是绝对不安全的。

    【讨论】:

    • 或者甚至将它们保存到磁盘。当我升级编译器时,我看到long 的字节顺序发生了变化。当然,磁盘通常是远程挂载的,网络上的其他一些机器总是会有不同的int 表示。
    猜你喜欢
    • 2013-12-13
    • 2021-04-08
    • 2014-11-16
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2013-01-21
    相关资源
    最近更新 更多