C ++ 11标准中的哪个部分规定了原始数据类型大小之间的相对排序?

时间:2018-05-24 09:43:41

标签: c++ c++11 types

我试图找出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尺寸部分找到特定语言 整数类型,它清楚地说明了每种类型的最小值和最大值,间接确定了大小之间的相对顺序。

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

2 个答案:

答案 0 :(得分:8)

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

  

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

请注意,C标准中的5.2.4.2/1仅定义每个整数类型的最小范围,但不强制执行排序 - 我可以从-32767到32767 intshort从-2147483647到2147483647,仍然符合本节的要求。

然而6.2.5.8更明确:

  

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

6.3.1.1告诉你:

  

long long int的等级应大于long int的等级,其应大于int的等级,其应大于short int的等级,short int应大于signed char的等级。

答案 1 :(得分:3)

从第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 ++标准的一部分。