“int”真的要求至少与C中的“short”一样大吗?

时间:2012-05-27 13:43:10

标签: c standards c99 c89

我在不同来源阅读了几次(例如维基百科:http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size),在C中,long long不小于long,不小于int,不是小于短。

但是,我已经在C90和C99标准中查明了这一点,并且没有找到相应的条款。我发现只有C90和C99规定了最小型号(C90和C99标准中的第5.2.4.2.1节),而不是它们相互之间的尺寸。我是否错过了标准中的某些内容?

3 个答案:

答案 0 :(得分:13)

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

6.2.5p8说:

  

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

它没有说明它们的相对尺寸,事实上,理论上可以使符合(但故意不正常)的实现具有sizeof (short) > sizeof (int)。仅当short具有比int更多的填充位(对该值没有贡献的位)时,才有可能实现此目的。这是不太可能的;大多数实现根本没有填充位,我知道没有实现整数类型范围的关系与它们的大小关系不同。

参考:N1256,最新的C99草案,或N1570,最新的C2011草案。

答案 1 :(得分:10)

我认为维基百科文章指的是那些整数类型的值范围,而不是 size (由sizeof报告)。< / p>

来自C99 standard draft N1256

<强> 6.3.1.1/1

  

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

<强> 6.2.5 / 8

  

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

答案 2 :(得分:6)

来自C2011 Standard

  

6.3.1.1/1

     

- long long int 的排名应大于 long int 的排名,   应大于 int 的等级,该等级应大于 short的等级   int ,应大于 signed char 的等级。