在一个Cexpression式中,unsigned int和signed int都存在,哪个types会被提升到什么types?
我有一个关于C语言标准的数据types提升规则的查询。 C99说:
C整数升级还要求“如果int可以表示原始types的所有值,则该值将被转换为int;否则,将被转换为unsigned int。
我的问题是在C语言expression式的情况下, unsigned int
和signed int
是否存在,哪种types将被提升为什么types?
例如, int
不能表示所有unsigned int
值(大于MAX_INT
值),而unsigned int
不能表示-ve值,那么在这种情况下什么types被提升为什么?
我认为以下回答你的问题:
6.3.1.3有符号和无符号整数
1当整数types的值被转换为除_Bool以外的另一个整数types时,如果该值可以由新types表示,则不变。
2否则,如果新types是无符号的,则通过反复地增加或减去新types中可以表示的最大值之一来转换该值,直到该值在新types的范围内。
3否则,新types被签名并且不能在其中表示值; 结果是实现定义的或实现定义的信号被引发。
我认为你混淆了两件事。 促销是int / unsigned int整数types“更小”的值被转换为int或unsigned int的过程。 规则有些奇怪地expression(主要是为了处理足够的字符),但确保价值和标志是守恒的。
那么算术运算符的操作数被转换为通用types的通常算术转换就有不同的概念。 如果它们的types小于int,则通过提升操作数(int或unsigned)开始,然后通过以下过程select目标types(对于整数types6.3.1.8/1)
如果两个操作数具有相同的types,则不需要进一步的转换。
否则,如果两个操作数都具有带符号的整数types或两者都具有无符号的整数types,则将具有较小整数转换等级的操作数转换为具有较高等级的操作数的types。
否则,如果具有无符号整数types的操作数的级别大于或等于另一操作数的types的级别,则将具有有符号整数types的操作数转换为具有无符号整数types的操作数的types。
否则,如果具有有符号整数types的操作数的types可以表示具有无符号整数types的操作数types的所有值,则将具有无符号整数types的操作数转换为具有有符号整数types的操作数的types。
否则,两个操作数都转换为与带符号整数types的操作数types相对应的无符号整数types。
(请注意,ISTR这些规则在C89和C99之间略有变化)