2 回答
TA贡献1850条经验 获得超11个赞
我认为以下回答了您的问题:
6.3.1.3有符号和无符号整数
1将整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值不变。
2否则,如果新类型是无符号的,则通过重复添加或减去比新类型可表示的最大值多一个值来转换值,直到该值在新类型的范围内为止。
3否则,将对新类型进行签名,并且无法在其中表示值;结果是实现定义的,还是引发实现定义的信号。
TA贡献1852条经验 获得超7个赞
我认为您在混淆两件事。提升是将int / unsigned int的“较小”整数类型的值转换为int或unsigned int的过程。这些规则有些奇怪(主要是为了充分处理char),但要确保其值和符号得到保留。
然后是普通算术转换的不同概念,通过该概念,算术运算符的操作数被转换为通用类型。首先,如果操作数的类型小于int,则将其提升为int或unsigned,然后通过以下过程选择目标类型(对于整数类型6.3.1.8/1)
如果两个操作数具有相同的类型,则无需进一步转换。
否则,如果两个操作数都具有符号整数类型或都具有无符号整数类型,则将具有较小整数转换等级的操作数转换为具有较大等级的操作数的类型。
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则将带符号整数类型的操作数转换为无符号整数类型的操作数的类型。
否则,如果带符号整数类型的操作数的类型可以表示带无符号整数类型的操作数的所有值,则带无符号整数类型的操作数将转换为带符号整数类型的操作数的类型。
否则,两个操作数都将转换为与带符号整数类型的操作数类型相对应的无符号整数类型。
(请注意ISTR,这些规则在C89和C99之间略有变化)
- 2 回答
- 0 关注
- 628 浏览
添加回答
举报