我试图找出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继承?标准中的语言在哪里?
答案 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 int
和short
从-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 ++标准的一部分。