【问题标题】:Are the fixed width integer types guaranteed to be typedefs for the standard built in types?固定宽度整数类型是否保证是标准内置类型的 typedef?
【发布时间】:2015-06-24 21:51:44
【问题描述】:

对于shortunsigned long 等内置类型之一,来自<cstdint> 的类型(例如int16_tuint_fast64_tint_least8_t)是否保证为typedefs?

或者是否允许使用非通常内置类型的类型来实现固定宽度类型?

【问题讨论】:

    标签: c++ language-lawyer


    【解决方案1】:

    不,至少对于 intN_t 类型不是。这些类型保证具有二进制补码表示(根据 C++11 和 C++14 引用的 C99 7.18.1.1)。并且标准整数类型不必是二进制补码。

    C11 相对于 C99 也有重要的变化(实际上只是错误修复),强调了上面的一点:

    7.20.1.1/3:

    但是,如果实现提供整数类型 宽度为 8、16、32 或 64 位,无填充位,和(对于有符号类型)具有 二进制补码表示,它应该定义相应的typedef名称。

    【讨论】:

    • 但这并不能证明实际上允许不使用二进制补码的实现提供那些可选类型(在 C++ 中),不是吗?
    • @BaummitAugen 在任何情况下都不禁止实现提供这些可选类型,如果标准类型不是二进制补码,intN_t 类型肯定不会是标准类型的 typedef。
    【解决方案2】:

    这些由 C 标准指定(并由 C++ 标准通过引用合并),它要求每个都是 有符号整数类型无符号整数类型的 typedef >,视情况而定。

    有符号整数类型依次由核心语言定义为由标准有符号整数类型signed charshort intintlong intlong long int) 以及任何实现定义的扩展有符号整数类型

    同样,无符号整数类型由核心语言定义为由标准无符号整数类型组成(它们是unsigned charunsigned short intunsigned intunsigned long intunsigned long long int) 以及与扩展有符号整数类型相对应的任何实现定义的扩展无符号整数类型

    简而言之,这些类型定义中的每一个都可能是通常的内置类型之一或实现定义的扩展整数类型。大多数编译器不支持扩展整数类型,因此在那些编译器上它们必须是内置类型。

    【讨论】:

      【解决方案3】:

      我面前有一份 C99 规范草案,还有一份 C++14 规范草案。由于这些是草稿,因此这些信息可能不正确,但我相信最终版本中的措辞是相同的。

      在 C++14 规范中,§18.4.1 对<cstdint> 有这样的说法:

      namespace std {
         typedef signed-integer-type int8_t; // optional
         typedef signed-integer-type int16_t; // optional
         typedef signed-integer-type int32_t; // optional
         typedef signed-integer-type int64_t; // optional
      
         [ etc. ]
      }
      

      然后说

      头文件定义了与 C 标准中的 7.18 相同的所有函数、类型和宏。

      我查看了 C99 标准草案第 7.18 节,并没有看到任何要求定义的类型实际上是内置类型(如 intlong int 等)的别名。它只是说如果这些类型存在,它们必须满足关于其范围、大小和内存布局的某些限制。

      总的来说,我强烈怀疑答案是否定的,但如果我弄错了,我很想看看我在哪里误读了规范。 :-)

      希望这会有所帮助!

      【讨论】:

      • 似乎是这里最有力的证明了,希望也是正确的(而且就我所见)。如果有语言律师过来反驳你的回答,我明天再检查。
      【解决方案4】:

      来自 C++ 标准:“也可能存在实现定义的扩展有符号整数类型。标准和扩展有符号整数类型统称为有符号整数类型。”。 (我认为关于扩展的无符号整数类型也有类似的说法)没有说明您将如何使用这些扩展的整数类型,它们显然是不可移植的并且实现定义。

      但是,int16_t 等可以是扩展整数类型的 typedef。

      【讨论】:

      • 扩展整数类型仍必须遵守整数类型的所有核心语言规则。
      • 这并没有说明是否允许使用这些扩展类型来实现<cstdint>中的类型。
      • @BaummitAugen 确实如此。 <cstdint> 中的类型要求是有符号或无符号整数类型,gnasher729 的引用显示了标准如何定义“有符号整数类型”。显示“有符号整数类型”允许“扩展有符号整数类型”回答了您的问题,不是吗?
      • @hvd 如果我们将您的评论(加上一些标准报价)和上述答案结合起来,我们可能会有答案。 :)
      • @BaummitAugen 我明白你的意思,答案可能更清楚。如果 gnasher729 想将我的评论纳入答案,我完全可以接受,最好也详细说明一下。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多