在存在unsigned int和signed int的C表达式中,哪种类型将提升为哪种类型?

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

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

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

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


慕慕森
浏览 629回答 2
2回答

慕盖茨4494581

我认为以下回答了您的问题:6.3.1.3有符号和无符号整数1将整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值不变。2否则,如果新类型是无符号的,则通过重复添加或减去比新类型可表示的最大值多一个值来转换值,直到该值在新类型的范围内为止。3否则,将对新类型进行签名,并且无法在其中表示值;结果是实现定义的,还是引发实现定义的信号。

慕姐4208626

我认为您在混淆两件事。提升是将int / unsigned int的“较小”整数类型的值转换为int或unsigned int的过程。这些规则有些奇怪(主要是为了充分处理char),但要确保其值和符号得到保留。然后是普通算术转换的不同概念,通过该概念,算术运算符的操作数被转换为通用类型。首先,如果操作数的类型小于int,则将其提升为int或unsigned,然后通过以下过程选择目标类型(对于整数类型6.3.1.8/1)如果两个操作数具有相同的类型,则无需进一步转换。否则,如果两个操作数都具有符号整数类型或都具有无符号整数类型,则将具有较小整数转换等级的操作数转换为具有较大等级的操作数的类型。否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则将带符号整数类型的操作数转换为无符号整数类型的操作数的类型。否则,如果带符号整数类型的操作数的类型可以表示带无符号整数类型的操作数的所有值,则带无符号整数类型的操作数将转换为带符号整数类型的操作数的类型。否则,两个操作数都将转换为与带符号整数类型的操作数类型相对应的无符号整数类型。(请注意ISTR,这些规则在C89和C99之间略有变化)
打开App,查看更多内容
随时随地看视频慕课网APP