【问题标题】:Which section in the C++11 standard dictates the relative ordering between the sizes of primitive data types?C++11 标准中的哪个部分规定了原始数据类型大小之间的相对顺序?
【发布时间】:2018-05-24 09:43:40
【问题描述】:

我正在尝试查找 C++ 标准是否指定了各种类型的大小之间的关系。例如,https://stackoverflow.com/a/589599/1175080 的这个答案似乎声称:

sizeof(short int) <= sizeof(int) <= sizeof(long int)

https://stackoverflow.com/a/589684/1175080 的另一个回答也有类似的说法:

sizeof(int) <= sizeof(long)

我正在查看n3337.pdf(我相信这是 C+11 标准的良好代理),但我找不到保证这些不等式的特定语言。

n1256 (C99) 中,我可以在 5.2.4.2.1 Sizes 部分找到具体的语言 整数类型清楚地说明了每种类型的最小值和最大值,从而间接建立了大小之间的相对顺序。

这些不等式是在 C++ 标准中类似定义还是直接继承自 C?标准中的语言在哪里?

【问题讨论】:

  • 它们直接继承自 C,并且在 C++ 标准中得到保证和记录。一些语言律师可以很容易地为您指出正确的部分。
  • 另见 18.3.3/2
  • N1256其实是C99+TC3
  • 错过了 C++11 的焦点。如果有什么安慰的话,C++17 明确表示“它是由 C 标准指定的”。
  • @M.M 我一直想知道为什么C99标准和C99+TC3不一样?是否像软件版本中的 v1.0.0 与 v1.0.3。标准中的 C99+TC3 错误修复是否在 C99 之上?我看到open-std.org/jtc1/sc22/wg14/www/standards 只有一个指向 N1256.pdf 的链接。它们似乎没有提供指向实际 C99 文档的链接。

标签: c++ c++11 types


【解决方案1】:

在n3337中,该部分是3.9.1[basic.fundamental]/2,第二段(重点是我的):

有五种标准的有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。在此列表中,每种类型提供的存储空间至少与列表中其前面的类型一样多。也可能有实现定义的扩展有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型。普通整数具有执行环境架构所建议的自然大小44;提供其他有符号整数类型以满足特殊需要。


请注意,C 标准中的 5.2.4.2/1 仅定义了每个整数类型的最小范围,它不强制排序 - 我可以将 int 从 -32767 到 32767 和 short 从 -2147483647 到 2147483647 和仍然符合本节。

但是6.2.5.8 更明确:

对于任何两个具有相同符号和不同整数转换等级的整数类型(见 6.3.1.1),具有较小整数转换等级的类型的值范围是另一个类型的值的子范围。

6.3.1.1 告诉你:

long long int 的rank 大于long int 的rank 大于int 的rank 大于short int 的rank 大于signed char 的rank .

【讨论】:

    【解决方案2】:

    从第 3.9.1 节第 2 段开始:

    有五种标准的有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。在此列表中,每种类型 至少提供与列表中它前面的存储一样多的存储空间。 也可能有实现定义的扩展有符号整数 类型。标准和扩展的有符号整数类型统称为 称为有符号整数类型。普通整数具有自然大小 由执行环境44的架构建议;这 提供其他有符号整数类型以满足特殊需要。

    了解两个主要的 64 位变体 LP64 and LLP64 也很好。基本上,所有的 Unix 操作系统(包括 MacOS/OSX)都是 LP64,而 Windows 是 LLP64。但这当然不是 C 或 C++ 标准的一部分。

    【讨论】:

    • 那是一个“段落”,而不是一个“注释”。 “注意”在 ISO 标准中具有非常特殊的含义。
    • @T.C.谢谢,更新的答案。不过,布局使它看起来像一张便条;)
    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2016-12-21
    相关资源
    最近更新 更多