C “整数转换秩”的定义不明确`
在C “整数转换秩”的定义不明确`,c,implicit-conversion,coercion,C,Implicit Conversion,Coercion,在6.3转换中,有符号整数类型的整数转换秩定义为与精度成比例 rank(short) < rank(int) < rank(long) 有符号整数类型的秩应大于精度较低的任何有符号整数类型的秩。C11§6.3.1.1 然后它说, long-long-int的等级应大于long-int的等级,后者应大于int的等级,后者应大于short-int的等级,后者应大于。。。等 所以,这是不明确的。因为int的精度可以等于long的精度,也可以等于short的精度,具体取决于int的实现 i
6.3转换
中,有符号整数类型的整数转换秩定义为与精度成比例
rank(short) < rank(int) < rank(long)
有符号整数类型的秩应大于精度较低的任何有符号整数类型的秩。C11§6.3.1.1
然后它说,
long-long-int
的等级应大于long-int
的等级,后者应大于int
的等级,后者应大于short-int
的等级,后者应大于。。。等
所以,这是不明确的。因为int
的精度可以等于long
的精度,也可以等于short
的精度,具体取决于int的实现
int
的精度可以是long
或short
(定义见
)。另一方面,它表示秩(int
)short
),即使在
中,它们可能是相同的
所有这些东西的模糊性在哪里?在精度方面,通常
long>long>int>short
。即使不是这样,而且它们的精度都相同,这仍然意味着秩是long>long>int>short
。第二段明确指出
例如,short
的排名永远不会高于long
。即使它们在平台上的精度相同
换句话说,数据类型的精度可能因平台而异(它可能是long-long>long>int>short
,但也可能是long-long==long==int==short
),这些类型的排名总是相同的,正如标准所规定的那样:long>long>int>short
没有歧义,因为第一段:
有符号整数类型的秩应大于
精度较低的任何有符号整数类型
只是说一个比其他类型精度更高的类型必须比其他类型具有更高的等级
第二段:
long-long-int的等级应大于long-int的等级,
它应该大于int的秩,int的秩应该大于
比短int的秩大,该秩应大于。。。等
适用于平台具有两种不同类型且精度相同的情况,在这种情况下,标准规定排名始终为:long>long>int>short
类型的精度取决于平台(唯一的例外是,标准中规定的级别较高的类型的精度必须等于或大于级别较低的类型)。
类型的等级由标准指定,因此与平台无关
所以,这是不明确的。因为int的精度可以等于long的精度,也可以等于short的精度,这取决于int的实现
这可能很难理解,但并不含糊。您引用的两个条款之间没有冲突,因为它们没有规定具有相同精度的两个不同类型的整数转换秩必须相等
实际上,基于精度的要求最适用于扩展整数类型;对于标准整数类型,它与显式给定的排序要求是冗余的
这些东西的模糊性在哪里
标准委员会努力避免规范中的歧义。虽然它没有完全成功,但它在这方面做得相当好。您询问的条款没有歧义。没有歧义
你引用的两段话:
有符号整数类型的秩应大于精度较低的任何有符号整数类型的秩
及
long-long-int的等级应大于long-int的等级,long-long-int的等级应大于int的等级,后者应大于short-int的等级,后者应大于。。。等
。。。不要互相矛盾。让我们为long int
、int
和short int
中的每一个指定一个数字等级。假设long int
的秩为2,int
的秩为1,short int
的秩为0。现在,无论int
是否具有与short int
或long int
相同的精度,或者介于两者之间,上述两种说法都得到了满足。没有矛盾,也没有歧义
我认为您错误地将第一条语句解释为具有相同精度的有符号整数类型必须具有相同的秩,但是,它没有这样说。它只要求如果两个有符号整数类型具有不同的精度,则精度较高的一个具有比另一个更高的秩。我还怀疑“模棱两可”的意思是“自相矛盾”(同样,事实并非如此)。精确性 因为
int
的精度可以等于long
的精度,也可以等于short
的精度,具体取决于int
的实现。。。int
的精度可以是long
或short
这是事实,但并不完整。int
的精度可以不等于short
和long
。在这种情况下,它将介于short
和int
之间
以下是C规范所要求的。类型之间的精度可能相同,也可能不同
precision(short) <= precision(int) <= precision(long)
那么,为什么等级的定义是模糊的?它在哪里是模糊的?即使精度都一样,第一句话也可能成立。我在哪里