C#与JavaScript中Bitwise XOR运算结果不一致的原因及解决方案
运算结果不一致的原因
两种语言位运算的默认整数处理规则不同:
- JavaScript执行所有位运算前,都会自动把操作数转换为32位有符号补码整数,运算结果也按32位有符号整数解析。2654435769已经超过32位有符号整数的最大值(2^31-1 = 2147483647),会被自动截断高位,异或运算后得到的结果按32位有符号解析就是负数-1639703856。
- C#的位运算规则由操作数的声明类型决定,示例中用的
long是64位有符号整数,2654435769远小于64位有符号整数的取值上限,运算时不会做32位截断,最终异或结果按64位有符号解析得到正整数2655263440。
C# 中得到与JS一致结果的方法
只需要模拟JS的32位有符号整数运算逻辑即可,注意要加unchecked上下文避免溢出报错:
unchecked { int a = (int)2654435769; int b = (int)7562089; var result = a ^ b; // 运行结果为 -1639703856,和JavaScript输出完全一致 }
如果不想修改原始变量的类型,也可以在运算后做转换:
long a = 2654435769; long b = 7562089; int result = unchecked((int)(a ^ b));
内容的提问来源于stack exchange,提问作者LincolnGrey
相关产品推荐
相关产品推荐

