【问题标题】:Conversion rank of extended unsigned integer type扩展无符号整数类型的转换等级
【发布时间】:2019-12-23 18:20:06
【问题描述】:

转化排名在6.3.1.1/1中定义:

每个整数类型都有一个整数转换等级,定义如下:

——没有两个有符号整数类型具有相同的等级,即使它们 具有相同的表示。

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

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

——任何无符号整数类型的等级应等于 对应的有符号整数类型,如果有的话。

——任何标准整数类型的秩都应大于秩 具有相同宽度的任何扩展整数类型。

——char的秩应该等于signed char和unsigned的秩 字符。

_Bool 的排名应小于所有其他的排名 标准整数类型。

——任何枚举类型的等级应等于 兼容的整数类型(见 6.7.2.2)。

——任何扩展有符号整数类型相对于另一个的等级 具有相同精度的扩展有符号整数类型是 实现定义,但仍受制于其他规则 确定整数转换等级。

- 对于所有整数类型 T1T2T3,如果 T1 具有更高的等级 比T2T2 的排名高于T3,然后T1 的排名更高 排名高于T3

有一个关于有符号整数类型的规则:

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

问题:精度更高的扩展无符号整数类型能否具有更小的整数转换等级?

考虑size_tunsigned int。第一个是扩展整数类型,如果size_t 的整数转换等级小于unsigned int,则整数提升 应用于size_t,这可能会导致精度损失。

【问题讨论】:

  • For any two integer types with the same signedness and different integer conversion rank, the range of values of the type with smaller integer conversion rank is a subrange of the values of the other type 如果“更高精度”是指“更大范围的值”,那么我认为您所写的内容是不可能的。 “精度”这个词在这里很奇怪——任何整数类型都具有相同的精度 1(我希望)。
  • @KamilCuk 在这种情况下,不清楚有符号整数类型的等级应大于任何精度较低的有符号整数类型的等级中的精度意味着什么
  • "整数类型的精度是它用来表示值的位数,不包括任何符号位和填充位。整数类型的宽度相同,但包括任何符号位;因此对于无符号整数类型这两个值相同,而有符号整数类型的宽度比精度大一。"

标签: c integer language-lawyer conversion-rank


【解决方案1】:

首先,size_t 通常不是扩展整数类型,而是typedef 用于其他现有的无符号整数类型。即使这样,它的排名也可能低于或高于unsigned int。其次,标准在6.3.1.1p3 中说

  1. 整数提升保留值,包括符号。

即因此,值位多于unsigned int 的无符号整数类型的转换等级不能小于unsigned int,否则关于整数提升的条款将无效。

当然,正如 Kamil Cuk 指出的那样,6.2.5p8 nails it

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


我相信您将usual arithmetic conversions 与整数促销混淆了。通常的算术转换可能会丢失符号并修改负符号整数的值。

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 2012-11-18
    • 1970-01-01
    • 2015-03-18
    • 2016-10-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多