int main() {
unsigned i = 5;
int j = -10;
double d = i + j;
long l = i + j;
int k = i + j;
std::cout << d << "\n"; //4.29497e+09
std::cout << l << "\n"; //4294967291
std::cout << k << "\n"; //-5
std::cout << i + j << "\n"; //4294967291
}
我相信signed int
被提升为unsigned
在进行算术运算符之前。
While -10
转换为无符号unsigned integer underflow
(这是正确的术语吗?)会发生,并且在添加后打印4294967291
.
为什么这种情况没有发生int k
哪个打印-5
?
执行算术运算符的过程涉及到使两个值具有相同类型的转换。这个过程的名称是寻找普通型,对于以下情况int
and unsigned int
,转换称为常见的算术转换 http://en.cppreference.com/w/cpp/language/operator_arithmetic。期限晋升 http://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion在这种特殊情况下不使用。
如果是i + j
, the int
被转换为unsigned int
, 通过增加UINT_MAX + 1
到它。所以结果是i + j
is UINT_MAX - 4
,在您的系统上是4294967291
.
然后,您可以将该值存储在各种数据类型中;唯一需要进一步解释的输出是k
。价值UINT_MAX - 4
无法适应int
。这就是所谓的超出范围的分配结果值是实现定义的。在你的系统上它显然分配了int
具有相同表示形式的值unsigned int
value.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)