int -1--->11111.....111(32个1,四字节)无符号右移10位即得00000000001111....111(22个1)即十进制4194303
同样long -1是64个1无符号右移10位即得00000000001111....111(54个1)即十进制18014398509481983其他的,请看下面thinking in java中的一段话:
对char,byte或者short进行移位处理,那么在移位进行之前会自动转换成int。只有右侧的5个低位才会用到。这样可防止在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零填充”不会发生,所以在那些情况下会得到-1的结果。
同样long -1是64个1无符号右移10位即得00000000001111....111(54个1)即十进制18014398509481983其他的,请看下面thinking in java中的一段话:
对char,byte或者short进行移位处理,那么在移位进行之前会自动转换成int。只有右侧的5个低位才会用到。这样可防止在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零填充”不会发生,所以在那些情况下会得到-1的结果。
1 Java使用补码来表示二进制数,所以会出现4194303,18014398509481983的结果 在补码表示中,最高位为符号位,正数的符号位为0,负数为1。补码的规定如下:对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。对负数而 言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-42的补码为1010110 (00101010 按位取反11010101+1=11010110) 用补码来表示数,0的补码是唯一的,都为00000000。(而在原码,反码表示中,+0和-0的表示是不唯一的,可参见相应的书籍)。2 s >>>=10 存在数据转化,其可理解为 s=(short)(((int)s)>>>10),这是为何出现-1结果的原因
可以运行阿。