“整数转换排名”

时间:2016-09-15 13:52:07

标签: c implicit-conversion coercion

6.3 Conversions中,有符号整数类型的整数转换等级定义为与精度成比例。

  

有符号整数类型的等级应大于精度较低的任何有符号整数类型的等级。 C11§6.3.1.11

之后,它说,

  

long long int的等级应大于long int的等级,该等级应大于int的等级,该等级应大于short int的等级。 },大于......等等。

所以,这是模棱两可的。因为int的精度可以等于long的精度或等于short的精度,具体取决于int的实现。

int的精确度可以是longshort<limits.h>中的定义)之一。另一方面,它表示排名(int)&lt;排名(short),即使在<limits.h>中它们可能相同。

所有这些东西的模糊性在哪里?

4 个答案:

答案 0 :(得分:2)

一般来说long long > long > int > short在精确度方面。即使情况并非如此,并且它们具有相同的精度,这仍然意味着等级为long long > long > int > short。第二段明确指出。

例如,{p> short的排名不会高于long。即使他们在平台上具有相同的精度。

换句话说,数据类型的精度可能因平台而异(可能是long long > long > int > short,但也可能是long long == long == int == short),这些等级类型始终相同,由标准:long long > long > int > short指定。

没有歧义,因为第一段:

  

有符号整数类型的等级应大于等级   任何带有精度较低的有符号整数类型。

仅表示精度高于其他类型的类型必须的排名高于其他类型。

然后是第二段:

  

long long int的等级应大于long int的等级,   它应大于int的等级,它应该更大   比短的int的等级,它应该大于......等

对于平台有2种不同类型且精度相同的情况,在这种情况下标准表示等级总是long long > long > int > short

类型的精度取决于平台(唯一的例外是标准中指定的较高级别的类型必须具有与具有较低级别的类型相同或更大的精度)。 类型的等级由标准指定,因此与平台无关。

答案 1 :(得分:1)

没有歧义。

你引用的两个段落:

  

有符号整数类型的等级应大于精度较低的任何有符号整数类型的等级。

  

long long int的等级应大于long int的等级,该等级应大于int的等级,其应大于short int的等级,其应大于......等< / p>

......不要互相矛盾。让我们为long intintshort int中的每一个分配一个数字排名。假设long int的等级为2,int的等级为1,short int的等级为0.现在,无论int是否具有与short int相同的精度{1}}或long int或介于两者之间的某个地方,上述陈述均得到满足。没有矛盾也没有歧义。

我认为你错误地将第一个语句解释为具有相同精度的有符号整数类型必须具有相同的等级,但是,它没有说明这一点。它只需要如果两个有符号整数类型具有不同的精度,那么精度更高的那个具有比另一个更高的等级。我也怀疑是因为模棱两可的&#34;你的意思是&#34;自相矛盾的#34; (再次,它不是)。

答案 2 :(得分:0)

  

所以,这是模棱两可的。因为int的精度可以等于long的精度或等于short的精度,具体取决于int的实现。

可能很难遵循,但并不含糊。你引用的两个条款之间没有冲突,因为它们没有说明两个不同类型的整数转换等级必须相同。

实际上,基于精度的要求最适用于扩展整数类型;对于标准整数类型,它对于明确给定的排序要求是多余的。

  

所有这些东西的模糊性在哪里?

标准委员会努力避免规范中的含糊不清。虽然它还没有完全成功,但它在这方面做得相当不错。你所询问的条款没有含糊不清。

答案 3 :(得分:0)

<强>精密

  

因为int的精度可以等于long的精度或等于short的精度,具体取决于int的实现。 ...... int的精确度可以是longshort

之一

这是事实,但不完整。 int的精确度可以 shortlong 。在这种情况下,它将介于shortint之间。

C规范要求以下内容。精度在类型之间可能相同(也可能不相同)。

precision(short) <= precision(int) <= precision(long)

<强>等级

  

另一方面,它说rank(int)&lt;等级(短),即使它们可能是相同的。

当操作涉及不同类型时,较低等级操作数的类型将转换为较高等级操作数的类型。这与精度无关。对于shortintlong,没有关于排名联系。即使所有3种类型具有相同的精度, rank 的差异也是正确的。

rank(short) < rank(int) < rank(long)