unsignedu=10;inti=-42;cout
2 回答
沧海一幻觉
TA贡献1824条经验 获得超5个赞
cout<以32位机器为例,int能表示的最大值为2^32-1,最小值为-2^32。超过这个区间的int会溢出。这里,i=-42,显然不会溢出。两个int相加,结果还是int,所以得到-84是理所当然。cout<这里是unsignedint和int相加,两种不同的类型相加,编译器会做隐式类型转换。怎样转换?把有符号的转为无符号的!所以,这行代码相当于:cout<关键问题是,怎样把int转为unsignedint?计算机用补码表示负数,以整形i=-42为例,它在32位计算机中的补码表示为:11111111111111111111111111010110(如果按照16进制,则表示为:FFFFFFD6)所谓某个变量是int还是unsignedint,在计算机看来都是一回事。关键在于编译器怎样“看待”这个变量。现在编译器不把这个FFFFFFD6当int看了,而是要把它当unsignedint看待。于是,FFFFFFD6的含义就变成了:FFFFFFD6=2^31+2^30+...+2^7+2^6+2^4+2^2+2^1=4294967254也就是说,(int)-42与(unsignedint)4294967254其实是一回事,只不过编译器对它们的解释不同而已。结果已经很明了:4294967254+10=4294967264,这就是你得到的输出!
添加回答
举报
0/150
提交
取消