“整数转换等级”的模糊定义
Ambiguous definition of `integer conversion rank`
在6.3 Conversions
中,有符号整数类型的整数转换等级定义为与精度成正比。
The rank of a signed integer type shall be greater than the rank of any signed integer type with less precision. C11 §6.3.1.1 1
在那之后,它说,
The rank of long long int
shall be greater than the rank of long int
, which shall be greater than the rank of int
, which shall be greater than the rank of short int
, which shall be greater than ... etc
所以,这是模棱两可的。因为 int
的精度可以等于 long
的精度或等于 short
的精度,具体取决于 int.
的实现
int
的精度可能是long
或short
之一(<limits.h>
中的定义)。另一方面,它表示 rank(int
) < rank (short
),即使在 <limits.h>
中它们可能相同。
所有这些东西的歧义在哪里?
通常 long long > long > int > short
在精度方面。即使情况并非如此并且它们的精度都相同,这仍然意味着排名是 long long > long > int > short
。第二段明确指出。
例如,short
的排名永远不会高于 long
。即使它们在平台上的精度相同。
换句话说,数据类型的精度可能因平台而异(可能是long long > long > int > short
但也可能是long long == long == int == short
),rank[=这些类型的 39=] 始终相同,如标准所指定:long long > long > int > short
.
没有歧义因为第一段:
The rank of a signed integer type shall be greater than the rank of
any signed integer type with less precision..
只是说精度高于其他类型的类型必须具有比其他类型更高的等级。
然后第二段:
The rank of long long int shall be greater than the rank of long int,
which shall be greater than the rank of int, which shall be greater
than the rank of short int, which shall be greater than ... etc
适用于平台有 2 种具有相同精度的不同类型的情况,在这种情况下,标准表示排名 总是 : long long > long > int > short
.
类型的精度取决于平台(唯一的例外是标准中指定的更高级别的类型必须具有与较低级别的类型相同或更高的精度)。
类型的等级由标准指定,因此与平台无关。
So, this is ambiguous. Because the precision of int can be equal either to the precision of long or equal to the precision of short, depending on the implementation of int.
可能难以理解,但绝不含糊。你引用的两条规定之间没有冲突,因为他们没有说相同精度的两种不同类型的整数转换等级必须相等。
实际上,基于精度的要求最适用于扩展整数类型;对于标准整数类型,它与明确给出的排序要求是多余的。
Where is the ambiguity in all this stuff ?
标准委员会努力避免规范中出现歧义。虽然还没有完全成功,但是在这方面已经做得相当不错了。您所询问的条款没有歧义。
没有歧义。
你引用的两段话:
The rank of a signed integer type shall be greater than the rank of any signed integer type with less precision..
和
The rank of long long int shall be greater than the rank of long int, which shall be greater than the rank of int, which shall be greater than the rank of short int, which shall be greater than ... etc
……大家不要自相矛盾。让我们为 long int
、int
和 short int
中的每一个分配一个数字排名。假设long int
的秩为2,int
的秩为1,short int
的秩为0。现在,无论int
是否与[精度相同=12=] 或 long int
或介于两者之间,以上两个陈述都得到满足。没有矛盾,没有歧义。
我认为您错误地将第一条语句解释为具有相同精度的有符号整数类型必须具有相同的等级,但是,它并没有这样说。它只要求 if 两个有符号整数类型具有不同的精度,精度更高的具有更高的等级。我还怀疑 "ambiguous" 你的意思是 "self-contradictory" (这又不是)。
精度
Because the precision of int
can be equal either to the precision of long
or equal to the precision of short
, depending on the implementation of int
. ... The precision of int
may either be that one of long
or short
这是事实,但不完整。 int
的精度可以改为 不等于 short
和 long
。在这种情况下,它将介于 short
和 int
之间。
C 规范要求以下内容。类型之间的精度可能相同也可能不同。
precision(short) <= precision(int) <= precision(long)
排名
On the other hand it says that rank(int) < rank (short), even if in they may be the same.
当操作涉及不同类型时,低位操作数的类型转换为高位操作数的类型。与精度无关。对于 short
、int
、long
,没有 ties 关于 rank。即使所有 3 种类型具有相同的精度,rank 中的差异也是如此。
rank(short) < rank(int) < rank(long)
在6.3 Conversions
中,有符号整数类型的整数转换等级定义为与精度成正比。
The rank of a signed integer type shall be greater than the rank of any signed integer type with less precision. C11 §6.3.1.1 1
在那之后,它说,
The rank of
long long int
shall be greater than the rank oflong int
, which shall be greater than the rank ofint
, which shall be greater than the rank ofshort int
, which shall be greater than ... etc
所以,这是模棱两可的。因为 int
的精度可以等于 long
的精度或等于 short
的精度,具体取决于 int.
int
的精度可能是long
或short
之一(<limits.h>
中的定义)。另一方面,它表示 rank(int
) < rank (short
),即使在 <limits.h>
中它们可能相同。
所有这些东西的歧义在哪里?
通常 long long > long > int > short
在精度方面。即使情况并非如此并且它们的精度都相同,这仍然意味着排名是 long long > long > int > short
。第二段明确指出。
short
的排名永远不会高于 long
。即使它们在平台上的精度相同。
换句话说,数据类型的精度可能因平台而异(可能是long long > long > int > short
但也可能是long long == long == int == short
),rank[=这些类型的 39=] 始终相同,如标准所指定:long long > long > int > short
.
没有歧义因为第一段:
The rank of a signed integer type shall be greater than the rank of any signed integer type with less precision..
只是说精度高于其他类型的类型必须具有比其他类型更高的等级。
然后第二段:
The rank of long long int shall be greater than the rank of long int, which shall be greater than the rank of int, which shall be greater than the rank of short int, which shall be greater than ... etc
适用于平台有 2 种具有相同精度的不同类型的情况,在这种情况下,标准表示排名 总是 : long long > long > int > short
.
类型的精度取决于平台(唯一的例外是标准中指定的更高级别的类型必须具有与较低级别的类型相同或更高的精度)。 类型的等级由标准指定,因此与平台无关。
So, this is ambiguous. Because the precision of int can be equal either to the precision of long or equal to the precision of short, depending on the implementation of int.
可能难以理解,但绝不含糊。你引用的两条规定之间没有冲突,因为他们没有说相同精度的两种不同类型的整数转换等级必须相等。
实际上,基于精度的要求最适用于扩展整数类型;对于标准整数类型,它与明确给出的排序要求是多余的。
Where is the ambiguity in all this stuff ?
标准委员会努力避免规范中出现歧义。虽然还没有完全成功,但是在这方面已经做得相当不错了。您所询问的条款没有歧义。
没有歧义。
你引用的两段话:
The rank of a signed integer type shall be greater than the rank of any signed integer type with less precision..
和
The rank of long long int shall be greater than the rank of long int, which shall be greater than the rank of int, which shall be greater than the rank of short int, which shall be greater than ... etc
……大家不要自相矛盾。让我们为 long int
、int
和 short int
中的每一个分配一个数字排名。假设long int
的秩为2,int
的秩为1,short int
的秩为0。现在,无论int
是否与[精度相同=12=] 或 long int
或介于两者之间,以上两个陈述都得到满足。没有矛盾,没有歧义。
我认为您错误地将第一条语句解释为具有相同精度的有符号整数类型必须具有相同的等级,但是,它并没有这样说。它只要求 if 两个有符号整数类型具有不同的精度,精度更高的具有更高的等级。我还怀疑 "ambiguous" 你的意思是 "self-contradictory" (这又不是)。
精度
Because the precision of
int
can be equal either to the precision oflong
or equal to the precision ofshort
, depending on the implementation ofint
. ... The precision ofint
may either be that one oflong
orshort
这是事实,但不完整。 int
的精度可以改为 不等于 short
和 long
。在这种情况下,它将介于 short
和 int
之间。
C 规范要求以下内容。类型之间的精度可能相同也可能不同。
precision(short) <= precision(int) <= precision(long)
排名
On the other hand it says that rank(int) < rank (short), even if in they may be the same.
当操作涉及不同类型时,低位操作数的类型转换为高位操作数的类型。与精度无关。对于 short
、int
、long
,没有 ties 关于 rank。即使所有 3 种类型具有相同的精度,rank 中的差异也是如此。
rank(short) < rank(int) < rank(long)