从理论上讲,实现是否可以将unsigned int提升为int?

时间:2013-03-29 10:36:01

标签: c standards c99

根据C99标准中的以下两个条款:

  

6.2.5-9

     

有符号整数类型的非负值范围是子范围   相应的无符号整数类型,以及表示形式   每种类型的相同值都是相同的。

     

6.2.6.2-2

     

对于有符号整数类型,对象表示的位应为   分为三组:值位,填充位和符号   位。不需要任何填充位;应该只有一个   标志位。作为值位的每个位应具有相同的值   相应的对象表示中的相同位   无符号类型(如果有符号类型中有M个值位且N in   无符号类型,则M≤N)。

(可能)签名类型可以表示相应的无符号类型可表示的所有数字。例如,如果使用31个值位和1个填充位表示unsigned int类型,则使用31个值位和无填充位表示signed int。

是否允许实施?如果是,这是否意味着在这种情况下unsigned int将被提升为int(因为两种类型都具有相同的转换排名,int可以表示{{1}的所有值代表)?

1 个答案:

答案 0 :(得分:4)

  

(可能)签名类型可以表示相应的无符号类型可表示的所有数字。例如,如果使用31个值位和1个填充位表示unsigned int类型,则使用31个值位和无填充位表示signed int。是否允许实施?

标准在6.3.1.8 Usual arithmetic conversions中确定:

  

否则,将对两个操作数执行整数提升。那么   以下规则适用于提升的操作数:   如果两个操作数具有相同的类型,则不需要进一步转换。

     

否则,如果两个操作数都有有符号整数类型或两者都有无符号   整数类型,具有较小整数转换等级类型的操作数是   转换为具有更高等级的操作数的类型。

     

否则,如果具有无符号整数类型的操作数的等级大于或等于   等于另一个操作数的类型的等级,然后是操作数   有符号整数类型转换为带有unsigned的操作数的类型   整数类型。

由于intunsigned int的排名相同(6.3.1.1 Boolean, characters, and integers),int会转换为unsigned int,但不是相反:< / p>

  

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

u为后缀的整数常量始终是无符号的(请参阅6.4.4.1 Integer constants中的表格)。

6.3.1.1 Boolean, characters, and integers第2条也告诉我们:

  

在int或unsigned int可以的任何地方都可以使用以下代码   使用:

     

- 具有整数转换等级较小的整数类型的对象或表达式   比int和unsigned int的等级。

     

- _Bool,int,signed int或unsigned int。

类型的位字段      

如果int可以表示原始类型的所有值,则该值将转换为int;   否则,它将转换为unsigned int。这些被称为整数   促销活动。所有其他类型都不会被整数促销更改。

所以,不,实施不能合法地将unsigned int转换为int,除非您通过强制转换或转让明确要求。

编辑6.3.1.1 Boolean, characters, and integers的第2条读作:

  

- 具有整数类型的对象或表达式,其整数转换等级更小   比 int和unsigned int的等级。

(国际标准ISO / IEC 9899第二版1999-12-01)

  

- 具有整数类型的对象或表达式,其整数转换等级小于或等于等级为int和unsigned int。

(WG14 / N1256委员会草案 - 2007年第7章ISO / IEC 9899:TC3)

  

- 具有整数类型(除int或unsigned int 之外)的对象或表达式,其整数转换等级小于或等于 int和unsigned的等级中间体

(N1548委员会草案 - 2010年12月2日ISO / IEC 9899:201x,
N1570委员会草案 - 2011年4月12日ISO / IEC 9899:201x)

只是为了好玩,C ++ 11的4.5 Integral promotions [conv.prom]

  

除bool,char16_t,char32_t或wchar_t之外的整数类型的整数转换的整数转换   如果int可以表示all,则rank(4.13)小于int的rank可以转换为int类型的prvalue   源类型的值;否则,源prvalue可以转换为unsigned类型的prvalue   中间体

(N3242 = 11-0012,
N3337日期:2012-01-16,
国际标准ISO / IEC 14882第三版2011-09-01)