众所周知,如果您具有两个操作数的表达式,则计算值的类型将是较大的(以字节为单位)类型,它们是整数,如果是实数,则精度最高。
例如:
( 1 + 2L ) = 3L
int + long = long
( 1L + 1.0 ) = 1.0
long + double = double
但是,如果您有:
(signed int + unsigned int)
或
(wchar_t + short)
答案 0 :(得分:0)
2.8.1.2。有符号和无符号整数 不同类型的整数之间的大量转换是通过在表达式中混合各种整数形式引起的。只要发生这些情况,整体促销就已经完成。对于所有这些类型,如果新类型可以包含旧类型的所有值,则该值将保持不变。
从有符号整数转换为长度等于或大于原始类型的无符号整数时,如果有符号值是非负数,则其值不变。如果该值为负,则将其转换为较长类型的带符号形式,然后通过在概念上将其添加到大于可在无符号类型中保留的最大值的值中使其变为无符号。在二进制补码系统中,这保留了正数的原始位模式,并保证了负数的“符号扩展”。
每将整数转换为较短的无符号类型,就不会有“溢出”,因此结果被定义为“除以非负数的余数除以可以得到的最大无符号数之外的最大数。以较短的类型表示”。这仅意味着在二进制补码环境中,低位被复制到目的地,高位被丢弃。
如果没有足够的空间容纳该值,则将整数转换为较短的有符号类型会遇到麻烦。在那种情况下,结果是实现定义的(尽管大多数旧时代的人希望只复制低阶位模式)。
如果您还记得积分促销,那么最后一项可能会让人有些担心,因为您可能会这样解释:如果我将一个字符分配给另一个字符,则首先将右侧的字符提升为其中一种int;进行赋值会导致将int转换(例如)为char并引发“实现定义”子句吗?答案是否定的,因为指定的分配不涉及积分促销,所以您很安全。