我在JavaScript和C#中使用了&运算符,但结果不同。为什么在JavaScript和C#中使用&运算符时返回不同的值?
C#代码
Int64 x = (634586400000000000 & 4611686018427387903);
x= 634586400000000000;
JavaScript代码
var x = (634586400000000000 & 4611686018427387903);
x= 0;
任何想法?
我在JavaScript和C#中使用了&运算符,但结果不同。为什么在JavaScript和C#中使用&运算符时返回不同的值?
C#代码
Int64 x = (634586400000000000 & 4611686018427387903);
x= 634586400000000000;
JavaScript代码
var x = (634586400000000000 & 4611686018427387903);
x= 0;
任何想法?
它看起来像我超过了JavaScript的最大整数值。 JavaScript整数支持的最大值为2^53。
UPDATE:
我在这里的最初的反应是不正确的 - 问题不在于JavaScript的最大整数值,它的每个操作数由符号运算处理的最大值:
var biggest = 4294967291; // maximum 32 bit unsigned integer
alert(biggest & 1); // alerts 1
alert((biggest + 1) & 1); // alerts 0
快乐编码!
乙
Bitwise operators在JavaScript转换操作数符号的32位整数(从天然IEEE 754浮点数号码存储在)。
像[bigInt.js](http://www.leemon.com/crypto/BigInt.html)这样的库在这里可能会有帮助,虽然我没有亲自尝试过。 – darioo
这意味着您不能对大于(大约)20亿或低于(大致)-2亿的数字执行任何双向操作。如果你这样做,行为没有被定义。 –
其实行为是明确的。从“JavaScript:The Defenitive Guide”(第73页):“如果按位运算符的操作数不是整数或太大而不适合32位整数表示形式,则只需将操作数强制为32位整数任何操作数的小数部分或32位以外的任何位“。 –
位运算符处理最大32位。我不知道当问它处理更大的值时,行为是如何定义的。
...因为JavaScript和C#是不同的语言? – BoltClock