在一个C表达式中,unsigned int和signed int存在,哪种类型将被提升为什么类型?

时间:2010-02-17 12:48:56

标签: c integer-promotion

我对C语言标准中的数据类型提升规则有疑问。 C99说:

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

我的问题是在C语言表达式中,unsigned intsigned int存在,哪种类型会被提升为什么类型?

E.g。 int无法代表unsigned int的所有值(大于MAX_INT值的值),而unsigned int无法表示-ve值,因此将哪种类型提升为此类值例

2 个答案:

答案 0 :(得分:43)

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

然后存在通常的算术转换的不同概念,通过算术运算符的操作数被转换为公共类型。它首先提升操作数(int或unsigned),如果它们的类型小于int,然后通过以下过程选择目标类型(对于整数类型,6.3.1.8 / 1)

  

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

     

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

     

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

     

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

     

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

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

答案 1 :(得分:24)

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

  

6.3.1.3有符号和无符号整数

     

1 当整数类型的值为   转换为另一种整数类型   除了_Bool,如果值可以   由新类型代表,它是   不变。

     

2 否则,如果是新的   type是无符号的,值是   通过反复添加或转换   减去一个以上的最大值   可以在中表示的值   新类型,直到值在   新类型的范围。

     

3 否则,   新类型是签名和值   不能代表它;或   结果是实现定义的   或者是实现定义的信号   提高。