【问题标题】:int_least64_t vs int_fast64_t vs int64_tint_least64_t vs int_fast64_t vs int64_t
【发布时间】:2012-02-16 20:15:42
【问题描述】:

我正在尝试将我的代码移植到 64 位。

我发现 C++ 提供了 64 位整数类型,但我仍然对此感到困惑。

首先,我找到了四个不同的64位ints:

int_least64_t
int_fast64_t
int64_t
intmax_t

及其未签名的对应物。我使用sizeof() 对它们进行了测试,它们是 8 字节的,所以它们是 64 位的。

他们之间有什么不同? leastfast 类型的含义是什么? intmax_t呢?

【问题讨论】:

  • 这些 typedef 值得了解,但您确定您正在寻找正确的问题吗? “移植到 64 位”通常不需要您更改类型。在最好的情况下,你只需重新编译。
  • @KerrekSB:很好。我已经更新了我的答案来解决这个问题。

标签: c++ int 64-bit


【解决方案1】:

在您的平台上,它们都是相同基础数据类型的名称。在其他平台上,它们不是。

int64_t 必须是 64 位。在具有(例如)9 位字节的架构上,它根本不可用。

int_least64_t 是最小的数据类型,至少有 64 位。如果int64_t 可用,它将被使用。但是(例如)对于 9 位字节的机器,这可能是 72 位。

int_fast64_t是至少64位的数据类型,算术性能最好。它的存在主要是为了与int_fast8_tint_fast16_t 保持一致,在许多机器上它们将是 32 位,而不是 8 位或 16 位。再过几年,可能会有一个架构,其中 128 位数学比 64 位更快,但我认为今天不存在。


如果您要移植算法,您可能希望使用int_fast32_t,因为它可以保存旧的 32 位代码可以处理的任何值,但如果速度更快,它将是 64 位。如果要将指针转换为整数(为什么?),请使用 intptr_t

【讨论】:

  • “在(例如)9 位字节的架构上,它根本不可用。”值得一提的是,intN_t 的原始 POSIX 定义(作为 C90 的扩展)允许填充,因此您可以拥有 72 位 int64_t,其中 8 位用于填充。
  • 如果我错了请纠正我:关于 int64_t,如果我有一个 8 位平台,它将定义,如果我有其他不是 64 位的平台,它不会定义,可以吗? ;关于 int_least64_t :只有当我有一个至少或大于 64 位平台的 64 位平台时,它才会定义,但如果平台小于 64 位,它不会定义,这是真的吗,最后一个 int_fast64_t 是默认值,例如如果我有一个 64 位平台它将定义为 _int64 如果 i 等等,但条件至少是 8 位架构,谢谢。
  • @user722528:要拥有int64_t,64 位必须能被内存的基本单位(一个字节)整除。因此,对于 8 位字节,它会存在,但对于 16 位字节也是如此。或 4 位字节。
  • 如果字节是 8 位,仍然有可能(即使不太可能)不存在 64 位类型,在这种情况下,int64_t 将不会被定义。并且不允许使用 4 位字节; CHAR_BIT 必须至少为 8。
  • @BenVoigt +1 以获得很好的答案。不过我只是想知道,理论上如果您要将 int8_t 传递给使用参数但不执行任何算术运算的方法(例如,参数用作数组索引),那么最好只传递int8_t 而不是 int_fast8_t 可能会节省将额外 24 位复制到堆栈所需的时间?
【解决方案2】:

int64_t 正好有 64 位。它可能未针对所有平台进行定义。

int_least64_t 是最小的类型,至少有 64 位。

int_fast64_t 是处理速度最快的类型,至少有 64 位。

在 32 位或 64 位处理器上,它们都将被定义,并且都具有 64 位。在假设的 73 位处理器上,int64_t 不会被定义(因为没有正好是 64 位的类型),而其他的将有 73 位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 2011-09-18
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 2010-12-09
    • 2017-06-20
    相关资源
    最近更新 更多