+1
unsigned int cc = MSGBUFSIZE*100000;其实也是溢出了的,只是把int隐式转换成unsigned int 刚好把最高的符号位当成有效位了,所以就是正确的。为什么会刚好对呢?假设MSGBUFSIZE*100000计算得到的结果是:-1004967296,用16进制表示是:0xc4196a80(这个是补码,计算机保存数据都是补码形式)。从这个16进制的表示结果就可以看书已经产生溢出了,因为两个正数相乘的最高位有进位了,本来最高位是0,现在是1了,所以出现了两个大正数计算的结果是一个负数。当将int隐式转换成unsigned int时,最高位(刚才的进位)不在被看成符号位了,所以就刚好是就算的结果。
------解决方案--------------------
unsigned int v = 32900*100000;//warning: overflow in implicit constant conversion
unsigned int v = 32900*100000U;//type promotion, it's fine here