Javascript 对js数表示和his位运算的质疑&xFF1F;

Javascript 对js数表示和his位运算的质疑&xFF1F;,javascript,Javascript,我知道js数字由64位浮点类型表示。在这里,我可以清楚地看到这64位是怎样的 例如,-1意味着 所以,当两个数字按位运算时,它是否与64位数字表示有关?通过我的测试,整数的行为类似于两个32位数字,例如以下示例: -1 & 5 // 5 -1 & 2**31 // -2147483648 -1 & 2**32 // 0 所以我的问题是,当对两个数字进行按位计算时,它们的行为会像32位数字吗?就像java中的int一样?TL;博士: 否

我知道js数字由64位浮点类型表示。在这里,我可以清楚地看到这64位是怎样的

例如,-1意味着

所以,当两个数字按位运算时,它是否与64位数字表示有关?通过我的测试,整数的行为类似于两个32位数字,例如以下示例:

    -1 & 5   // 5
    -1 & 2**31  // -2147483648
    -1 & 2**32  // 0
所以我的问题是,当对两个数字进行按位计算时,它们的行为会像32位数字吗?就像java中的int一样?

TL;博士: 否。JS将浮点转换为整数

详情如下: JavaScript引擎只对32位整数值执行逐位操作
~
&
^
(但不是
),因此JS引擎需要先将浮点值和任何非整数值转换为32位整数。这意味着,如果操作数是非整数的,则按位操作是有损的


我知道js数字由64位浮点类型表示

这是一种过于简单化的做法。的确,
Number
值在外部可以表现得像64位IEEE-754数字(“双精度浮点”),但在内部引擎有很多lee way,除了规范要求对整数值进行逐位运算外,这对浮点值来说毫无意义。这是因为
Number
可以表示整数值和浮点值,在执行逐位操作之前,程序员需要确保它们的值是适当的。如果您尝试在32位整数和64位浮点之间执行按位异或,JS不会抱怨

所以,当两个数字按位运算时,它是否与64位数字表示有关

我想你是想问:

当两个数字按位运算时,它是否对其IEEE-754二进制表示执行按位运算

答案是“不”不在IEEE 754二进制表示上执行按位操作。JS的逐位运算符实际上导致JS引擎将(IEEE-754浮点)值转换为32位整数:

引用MDN,强调我的:

操作数转换为32位整数并用一系列位(0和1)表示。超过32位的数字将丢弃其最高有效位

ECMAScript规范6.1.6.1.16
numberbitwieseop
中描述了具体过程(重点内容):

抽象操作NumberBitwiseOp接受参数op(Unicode代码点序列)、x和y。调用时,它将执行以下步骤:

  • 断言:op是&、^或|
  • 让lnum去吧!ToInt32(x)
  • 让我们一起去吧!ToInt32(y)
  • 设lbits为32位2的补码位字符串,表示ℝ(lnum)
  • 设rbits为32位2的补码位字符串,表示ℝ(rnum)
  • 如果op是&,则result是对lbit和rbit应用按位AND运算的结果
  • 否则,如果op为^,则让result为对lbit和rbit应用逐位异或(XOR)操作的结果
  • 否则,op为|。设结果为对LBIT和RBIT应用按位包含或运算的结果
  • 返回由32位2的补码位字符串结果表示的整数的数值