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

gol*_*ean 25 c integer-promotion

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

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

我的问题是在C语言表达式的位置unsigned intsigned int存在的情况下,哪种类型将被提升为什么类型?

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

APr*_*mer 44

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

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

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

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

否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,然后用带符号的整数类型的操作数被转换成无符号整数类型的操作数的类型.

否则,如果用符号整型操作数的类型,可以表示所有与无符号整数类型的操作数的类型的值的,然后用无符号整数类型的操作数被转换成符号整型操作数的类型.

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

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


dir*_*tly 24

我认为以下回答你的问题:

6.3.1.3有符号和无符号整数

1当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变.

2否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.

3否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号.

  • @nonsensickle:不,`(int16_t)i`必须是70,因为70在`int16_t`的范围内.如果`i`超出`int16_t`的范围,你只能得到实现定义的行为. (7认同)