在C语言中,“int”是否真的需要至少与“short”一样大?

16

我在不同的来源中(例如维基百科:http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size)多次看到:在C语言中,long long不比long类型小,而long类型也不比int类型小,int类型也不比short类型小。

然而,当我查阅C90和C99标准时,并没有找到相应的条款。我只发现C90和C99规定了最小类型大小(C90和C99标准的5.2.4.2.1节),但没有规定它们之间的大小关系。我是否遗漏了标准中的内容?


4
不,但我没有看到使shortint更大的平台...这正是为什么每当我对这样的东西感到困惑时,我使用<stdint.h> - Richard J. Ross III
3个回答

13

6.3.1.1 定义了任意两种整数类型的相对 整数转换等级。这是一个抽象概念,只是为了定义两种类型之间的关系;没有任何值被定义为任何类型的 等级

6.2.5p8 表示:

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

它并未涉及它们的相对 大小,事实上,理论上可能出现一种遵循标准但刻意反常的实现,使得 sizeof(short) > sizeof(int)。这仅在 shortint 具有更多的 填充位(不影响值的位)时才是可能的。这种情况非常罕见;大多数实现根本没有填充位,我也不知道任何实现中整数类型的值范围关系与其大小关系不同。

参考资料:可以查看最新的 C99 草案 N1256 或最新的 C2011 草案 N1570


10

我认为维基百科文章指的是这些整数类型的值范围,而不是它们的大小(如sizeof所报告的)。

来自C99标准草案N1256

6.3.1.1/1

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

6.2.5/8

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


这并没有完全回答问题。相对转换等级实际上并不意味着相对大小。 - Keith Thompson

6

来自C2011标准

6.3.1.1/1

—— long long int的等级应该高于long int,后者又高于int,后者又高于short int,后者又高于signed char


说明:此段文字是从C2011标准中摘取的。其中规定了不同数据类型的等级关系,具体为:long long int > long int > int > short int > signed char。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接