27

我有一个关于 C 语言标准中的数据类型提升规则的查询。C99 说:

C 整数提升还要求“如果 int 可以表示原始类型的所有值,则将该值转换为 int;否则,将其转换为 unsigned int。”

我的问题是,如果存在 C 语言表达式,unsigned intsigned int哪种类型将提升为哪种类型?

例如int,不能表示unsigned int(值大于MAX_INT值)的所有值,而unsigned int不能表示 -ve 值,那么在这种情况下,什么类型被提升为什么?

4

2 回答 2

45

我认为你混淆了两件事。提升是将 int/unsigned int “较小”的整数类型值转换为 int 或 unsigned int 的过程。规则的表达有些奇怪(主要是为了充分处理字符),但确保值和符号是守恒的。

然后是通常算术转换的不同概念,通过该概念将算术运算符的操作数转换为通用类型。如果操作数的类型小于 int,则它首先提升操作数(为 int 或无符号),然后通过以下过程选择目标类型(对于整数类型,6.3.1.8/1)

如果两个操作数具有相同的类型,则不需要进一步转换。

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

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

否则,如果有符号整数类型的操作数的类型可以表示无符号整数类型的操作数的所有值,则将无符号整数类型的操作数转换为有符号整数类型的操作数的类型。

否则,两个操作数都转换为与带符号整数类型的操作数类型对应的无符号整数类型。

(请注意,ISTR 认为这些规则在 C89 和 C99 之间略有变化)

于 2010-02-17T13:06:39.160 回答
26

我认为以下内容回答了您的问题:

6.3.1.3 有符号和无符号整数

1当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则不变。

2否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。

3否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。

于 2010-02-17T12:58:20.023 回答