这个涉及到一个常量类型的问题,如果在C语言中语句x = 4 那么这个4与 sum = sum & 0xffff的类型是没有任何差别的,编译器都把它当作有符号int型常量,long型常量就在后面加L或l(小写L),无符号弄就在后面加u,所以实际上是32位的常量,高16位用0填充,还有就是即使是 sum = sum & (short)0xffff,也即我们强制后面的常量为short型,编译时会自动类型转换成与字节数长些的变量即sum对齐,还是会将高16位填充为0。

这就好比做运算1.0/10,会先把后面的有符号int型常量先自动转换成double型再做双精度浮点除法一样。