引用 ECMAScript 规范第 5.2 节:
符号“x 模 y”(y 必须是有限且非零)计算与 y(或零)符号相同的值 k,使得 abs(k) < abs(y) 并且 x−k = q × y整数q。
因此,如果 y 是正数,则无论 x 的符号如何,“x 模 y”的结果 k 都是正数。
如果我的理解是正确的,ToInt32(-1) 是否等于 ToInt32(1)?
引用 ECMAScript 规范第 5.2 节:
符号“x 模 y”(y 必须是有限且非零)计算与 y(或零)符号相同的值 k,使得 abs(k) < abs(y) 并且 x−k = q × y整数q。
因此,如果 y 是正数,则无论 x 的符号如何,“x 模 y”的结果 k 都是正数。
如果我的理解是正确的,ToInt32(-1) 是否等于 ToInt32(1)?
该符号x modulo y
在规范内部用于描述某些操作的结果。所以是的,结果k
是x modulo y
(根据定义)与 的符号相同y
。并未声称%
运算符等同于modulo
.
如果您有兴趣,%
可以在第 11.5.3 节中找到实际规范。有趣的是,它没有使用modulo
.
从我之前的答案中复制粘贴在这里:
取 a % b
1. When both +ve, Modulo & Remainder are one and the same
2. When a is -ve, they are not the same
例如;
a = -10, b = 3
-10 % 3 = -1 的余数
对于模数,将 3 的更大倍数添加到“a”并计算余数。
-10 + 12 = 2
2 % 3 = 2 是你的答案
该modulo
运算被定义为数学模运算:
数学运算,如加法、减法、否定、乘法、除法,以及本节后面定义的数学函数,应始终理解为计算数学实数的精确数学结果,不包括无穷大,也不包括负零区别于正零。
你的问题:
ToInt32(-1) 等于 ToInt32(1)
好吧,不:
让 posInt 为 sign(number) * floor(abs(number))。
posInt = sign(-1) * floor(abs(-1)) = -1;
令 int32bit 为 posInt 模 2 32;也就是说,具有正号且幅度小于 2 32的 Number 类型的有限整数值 k使得 posInt 和 k 的数学差在数学上是 2 32的整数倍。
int32bit = posInt mod 4294967296 = -1 mod 4294967296 = 4294967295
如果 int32bit 大于等于 2 31,则返回 int32bit − 2 32,否则返回 int32bit 。
因为4294967295 >= 2147483648
,我们返回4294967295 - 4294967296
,IE -1
。
如果我们运行相同的步骤ToInt32(1)
,我们得到1
. 所以他们没有相同的结果。