【问题标题】:Do int8_t, int16_t, int32_t and int64_t have same respective ranges on different C++ compilers?int8_t、int16_t、int32_t 和 int64_t 在不同的 C++ 编译器上是否具有相同的范围?
【发布时间】:2016-02-01 14:03:46
【问题描述】:

还是这个取决于16位、32位等编译器?

此外,这些数据类型在 C、C# 或 Java 中是否有效?

【问题讨论】:

    标签: c++ range


    【解决方案1】:

    intN_t 是 N 位长的精确宽度整数类型。根据 C11 草案 N1570 7.2.1.1,它们被定义为:

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

    然而

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

    这些类型在 C 和 C++ 中有效。我们之所以拥有这些正常的short、int 和long long,除了最小范围外,不能保证它们的大小

    在 C# 中,这相当于 Int16、Int32 和 Int64 类型。在Java中我们可以使用byte、short、int和long,因为它们都是guaranteed to be of an exact width.

    【讨论】:

    • 你能引用你的报价的来源吗? (哪个 C99 风格的草稿,还是来自真实的草稿?)open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 似乎是某种带有类似(完全相同?)措辞的草稿。
    • @Yakk 我添加了我的来源。我完全错过了那部分。对不起。
    • @NathanOliver 该问题被标记为C++。说这些类型在 C++ 中标准化是否正确? \ [basic.fundamental] 中没有提到它们。事实上,C++ 标准仅在 [cstdint.syn] 中偶然提及它们。
    • @Belloc 是的,它们是标准化的。只是 C++ 在这里根据[cstdint.syn]/2 退回到 C 标准
    • @Belloc 没问题。
    【解决方案2】:

    C++ 标准要求 int8_t、int16_t、int32_t 和 int64_t 精确地指定宽度,无符号对应项以 u 为前缀,仅当目标上存在此类类型时平台。是的,这些是 C 中有效的标准类型。Java 和 C# 不包含此类同名的整数数据类型。

    相关类型为intN_least_t 和intN_fast_t,其中“最少”类型至少具有指定的位数。

    【讨论】:

      【解决方案3】:

      它们具有基于标准 C++ 的相同范围。更多详情here

      它们在 C 上有效,但在 Java 和 C# 上不确定

      【讨论】:

      • 这个答案意味着 C++ 标准要求每个编译器都支持 int main() { int64_t x; } 作为有效程序。它不是。你能澄清一下吗?
      • 它们在stdint.h 中可用。您是否包含标题
      • C++ 标准不强制它们在stdint.h 中。它说可能存在,如果存在,它们必须具有某些属性。您的stdint.h(或我的)中发生的事情并不能解决问题。
      • open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4567.pdf -- 这是 C++ 工作草案标准的链接。其中,它指出这些类型不必在stdint.h 中。我已经重复了3次,我完成了。其他两个答案用更容易理解的术语来描述它,en.cppreference.com/w/cpp/types/integer 也是如此
      • 您能否指定行,您遇到它不必在stdint.h 中,因为它来自c99 到C++。他们将其称为cstdint。我们在同一页吗
      猜你喜欢
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多