【问题标题】:The difference of int8_t, int_least8_t and int_fast8_t?int8_t、int_least8_t 和 int_fast8_t 的区别?
【发布时间】:2011-07-12 08:41:08
【问题描述】:

int类型int8_tint_least8_tint_fast8_t有什么区别?

【问题讨论】:

  • 为什么这里有很好的答案,你却接受了错误的答案?
  • 事实上,这里的每一个答案除了你接受的答案都是正确的和信息丰富的。
  • @Jim,我的回答不正确,但并不是每个人都认为的那么不正确。我唯一错的是int_least8_t。无论如何,我已经编辑它是正确的
  • @Earlz 换句话说,关于 int8_t 是正确的,而对于其他一切都是错误的。至于“似乎每个人都在想什么”,你和我都不知道,但不可能有那么多,因为你的回答几乎没有得到应有的反对票数。

标签: c


【解决方案1】:

来自规范部分 7.8.1.1 精确宽度整数类型,第 1 段:

typedef 名称 intN_t 指定宽度为 N、无填充位和二进制补表示。因此,int8_t 表示宽度正好为 8 位的有符号整数类型。

来自:7.18.1.2 最小宽度整数类型,第 1 段:

typedef 名称 int_leastN_t 指定宽度至少为 N 的有符号整数类型,这样没有具有较小大小的有符号整数类型至少具有指定的宽度。因此,int_least32_t 表示宽度至少为 32 位的有符号整数类型。

最后来自 7.18.1.3 Fastest minimum-width integer types,第 2 段:

typedef 名称 int_fastN_t 指定最快的有符号整数类型,宽度至少为 N 。 typedef 名称 uint_fastN_t 指定最快的无符号整数类型,其宽度至少为 N。

【讨论】:

    【解决方案2】:

    这些与整数的大小有关,听起来就是这样。

    int8_t is exactly 8 bits
    int_least8_t is the smallest int type that has at least 8 bits
    int_fast8_t is the fastest int type that has at least 8 bits.
    

    【讨论】:

    • 这并不能真正解释差异,这是原始问题的重点。
    • @Jim Balter:那么根据这个答案,int_least8_tint_fast8_t 有什么区别,嗯?
    • @Conrad 答案只是缺少第二行中的“是最小的类型”这个词。呵呵。
    • @Conrad 是的,没错。什么,您预计 int_least8_t 可能很长? int8_t 解释为准确,int_fast8_t 解释为最快;这解释了 2/3 的差异。对 int_least8_t 的解释是有缺陷的,但很容易弄清楚是否花费了最少的努力。
    • @Conrad 顺便说一句,OP 写道“这确实解释了它们最初存在的原因”的公认答案在被接受时是严重错误的,并且 仍然 ,即使在编辑之后,也具有您声称的相同缺陷导致这不能“解释差异”。该答案的批评者会费心指出它有什么问题。
    【解决方案3】:

    intN_t(和uintN_t并非在所有 C99 实现中都需要。这些类型是“精确宽度整数类型”。在有意义的实现中需要它们(基本上是每台台式计算机)。

    对于 8、16、32 和 64 的 N 值,所有 C99 实现都需要int_leastN_t。这是“最小宽度整数类型”。

    对于 8、16、32 和 64 的 N 值,所有 C99 实现都需要int_fastN_t。这是“最快的最小宽度整数类型”。

    【讨论】:

    • 这样更好,因为它添加了符合要求的内容和可选的内容。来自我的 +1。
    【解决方案4】:

    Carl Norum 引用的 C99 标准的部分定义了差异。但举个例子可能会有用。

    假设您有一个用于 36 位系统的 C 编译器,char = 9 位,short = 18 位,int = 36 位,long = 72 位。那么

    • int8_t 不存在,因为没有办法满足正好 8 个没有填充的值位的约束。
    • int_least8_tchar 的类型定义。不是shortint,因为标准要求最小 类型至少有8 位。
    • int_fast8_t 可以是任何东西。如果“本机”大小被认为是“快速”,则它可能是 int 的 typedef。

    【讨论】:

      【解决方案5】:

      这是一个概念上简单的答案:所有三种类型的 int*N_t 的宽度必须 >= N。intN_t 有恰好 N 位,int_leastN_t 是最少(最窄) 这种类型,而 int_fastN_t 是 最快 这种类型。

      例如,在具有 8 位字节和 32 位快速寄存器的机器上,int8_t 和 int_least8_t 别名为 signed char,但 int_fast8_t 别名为 int32_t。然而,如果实现选择定义它们,则 int_least24_t 和 int_fast24_t 都将别名为 int32_t,而 int24_t 未定义。

      编辑:正如 Technophile 在下面指出的那样,快速类型的真正问题是内存,而不是寄存器(通常,对寄存器低位的操作可以像对整个寄存器一样快)。例如,写入内存中的 int8_t 可能需要加载包含它的 32 位字,仅修改字节,然后将其写回,而如果它存储在 32 位字中,则无需读取即可写入。

      【讨论】:

      • 只有在阅读了 this 答案后,我才意识到 int_fastN_t 类型的重要性。 N 位寄存器。这很明显,但是来自面向对象的世界 (Java),一开始很难实现这一点(至少自己)。
      • @Kohányi Róbert:这不是因为 Java 是面向对象的(也是 C++)。这是因为 Java 是独立于机器的(抽象的)。这就是为什么“注册”的概念在 Java 中相当没有意义(而且也是被禁止的)。
      • @axeoth 你是对的,它与面向对象无关,但这些类型的重点,尤其是。最少和最快的版本是机器独立性。 Java 实际上更依赖于机器,因为它的 int 类型是具体的——它们具有预定义和固定的大小……在没有 8 位字节的机器上实现 Java 是不可能的。并且寄存器的问题不相关......寄存器不是 C 内存模型的一部分,大多数编译器都会忽略“register”关键字,但是 C 和 Java 编译器当然都会生成寄存器代码。
      • @Kohányi Róbert:这可能与内存访问有关。例如,假设内存是 64 位字。考虑如何将 8、16 或 32 位值写入内存位置:处理器可能必须读取内存,修改所需位,然后写入 64 位值,而可以写入 64 位值一次访问。
      • 这是唯一一个甚至试图回答我来这里得到回答的问题的答案,所以我很惊讶它没有得到更多的支持。我怀疑这就是“快速”的原因,但我想确定一下,所以谢谢大家确认它与 CPU 操作和 RAM 访问细节有关。
      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 2013-08-07
      • 2011-10-20
      相关资源
      最近更新 更多