如何从Javascript';s代码

如何从Javascript';s代码,javascript,c#,bit-manipulation,bitwise-operators,Javascript,C#,Bit Manipulation,Bitwise Operators,我正在将一个库从javascript翻译成C#,在这种情况下: // Javascript var number = 3144134277.518717 | 0; console.log(number); // -> -1150833019 从我在另一篇文章中读到的内容来看,它可能被用来对值进行舍入,但在这种情况下,值不是我期望的值(如果它被舍入的话),我不能用C#再现与以下情况相同的行为: // C# 3144134277.5187168 | 0 // -> Operator '

我正在将一个库从javascript翻译成C#,在这种情况下:

// Javascript
var number = 3144134277.518717 | 0;
console.log(number); // -> -1150833019
从我在另一篇文章中读到的内容来看,它可能被用来对值进行舍入,但在这种情况下,值不是我期望的值(如果它被舍入的话),我不能用C#再现与以下情况相同的行为:

// C#
3144134277.5187168 | 0 // -> Operator '|' cannot be applied to operands 
                       //    of type 'double' and 'int'
// or
Convert.ToInt64(3144134277.5187168) | 0 // -> 3144134278

谢谢你的帮助

javaScript中
的工作方式很详细,但您主要看到的是
在执行按位OR之前将其操作数隐式转换为32位整数(这是一个不运算,因为第二个参数是
0
)。因此,实际上,您看到的是:

  • 让数字成为现实吧
    ToNumber(参数)
    。(基本上可以忽略这一点。)
  • 如果编号为
    NaN
    +0
    -0
    +∞,或
    -∞,返回
    +0
  • 设int为与数字符号相同的数学值,其大小为
    floor(abs(number))
  • 设INT32位为整数模2^32
  • 如果INT32位≥ 2^31,返回INT32位-2^32;否则返回int32位
  • 在C#中,我认为大致是:

    double value = 3144134277.5187168;
    bool negative = value < 0;
    long n = Convert.ToInt64(Math.Floor(Math.Abs(value)));
    n = n % 4294967296;
    n = n > 2147483648 ? n - 4294967296 : n;
    int i = (int)n;
    i = negative ? -i : i;
    Console.WriteLine(i); // -1150833019
    
    double value=3144134277.5187168;
    bool负值=值<0;
    long n=Convert.ToInt64(Math.Floor(Math.Abs(value));
    n=n%4294967296;
    n=n>2147483648?n-4294967296:n;
    int i=(int)n;
    i=负-一:我,;
    Console.WriteLine(一);//-1150833019
    
    …为了清晰起见,写得很详细。请注意,符号并没有添加回结果中与规范完全相同的位置;当我这样做时,它没有正常工作,这可能与规范的“模”和C#的
    %
    运算符之间的定义不同有关


    再仔细检查一下,那些带有
    -3144134277.5187168
    的步骤会给你
    1150833019
    ,这也是应该的。

    它确实是用来对值进行舍入的,但你发现这是非常危险的。JavaScript中的逐位算术将数值强制转换为32位,这反过来会导致大数溢出问题。非常感谢您的时间T.J。!