如何从Javascript';s代码
我正在将一个库从javascript翻译成C#,在这种情况下:如何从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
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
floor(abs(number))
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。!