线上分析某个网站的Javascript源码,想转换成对应的Java源码,但发现输出的结果不一样。
javascript源码
var e=271733878
var t=3705142957
var n=4023233417
var r=2562383102
var o=795631988
var a=12
var i=-389564586
var s = e + ((t & n | ~t & r)) + o + i
console.log(s)
console.log((s << a | s >>> 32 - a) + t)
java源码
long e=271733878L,
t=3705142957L,
n=4023233417L,
r=2562383102L,
o=795631988L,
a=12,
i=-389564586L,
s = e + (t & n | ~t & r) + o + i;
//System.out.println((int)s);
System.out.println(s);
//System.out.println(((int)( s << a | s >>> (32L - a)) + t));
System.out.println(( s << a | s >>> (32 - a)) + t);
如果把注释开启,可以返回正确的结果值。
输出结果:
javascript的位操作为什么在java对应的位操作存在不同的执行结果。求帮忙详细解析。
输出
值已超出32位整型最大值,首位是1,按整型规则会输出负值,所以需要用64位的 long 来存储。