经过试验,将版主的思路整理了一下,应该明白为什么了,我将思路再说清一点,就以我最后那两个计算的对比,大家就可以理解了。
aa = 4985 * 25;得到的结果是超界的,这是因为4985只需要2个字节空间,所以编译器默认为4985分配了两个字节也就是最小能存放开的空间用来存这个常量,接下来做乘法操作,所乘的结果却超出了存放这个常量的空间,结果就产生了溢出!注意这个空间与aa变量本身是无关的,aa是要等到4985 * 25的这个计算出来结果之后才被赋值的,而如果这时在4985上加强制类型转换,要求以long分配常量空间,就可以得到正确结果,即 aa = (long) 4985 * 25; 。后一个不需要转换,因为结果是向前边的空间存的,我想这个方向应该是跟运算符的结合性有关,所以如果是别的运算还要注意,不一定是前边的要强制类型。
aa = 65535 * 3;得到的结果并不超界,是因为65535虽然没有超过65536,但系统默认分配两个字节时是int,而不是unsigned int,这与编译器的设置可能有关,我记得有一个选择默认是有还是无符号的选项,所以因此造成大于32767的值都会当作long处理,所以空间已经有4个字节了,当然就可以任意计算了,别说乘3,乘32767都可以。实际上,最大可以写的是65536*32767,再大就必须声明为无符号了。
实验最终完毕,对此问题我已不会再心存疑问了。