引用ECMAScript规范第5.2节:
符号“x modulo y”(y必须是有限且非零)计算a 与y(或零)相同符号的值k使得abs(k)< abs(y)和 对于某个整数q,x-k = q×y。
所以如果y为正,则无论x的符号如何,'x modulo y'的结果k都是正的。
如果我的理解是正确的,ToInt32(-1)等于ToInt32(1)?
答案 0 :(得分:5)
符号x modulo y
在规范内部用于描述某些操作的结果。是的,k
的结果x modulo y
(根据定义)与y
的符号相同。并未声明%
运算符等同于modulo
。
如果您有兴趣,可以在第11.5.3节找到%
的实际规格。有趣的是,它没有使用modulo
。
答案 1 :(得分:0)
从我之前的回答here:
复制粘贴拿一个%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
对于Modulo,在'a'中添加3的倍数并计算余数。
-10 + 12 = 2
2%3 = 2是你的答案
答案 2 :(得分:-1)
modulo
操作被定义为数学模运算:
数学运算,如加法,减法,否定, 乘法,除法和后面定义的数学函数 在本节中,应始终将其理解为精确计算 关于数学实数的数学结果,没有 包括无穷大,不包括负零 区别于正零。
你的问题:
ToInt32(-1)等于ToInt32(1)
嗯,不:
让posInt为sign(number)* floor(abs(number))。
posInt = sign(-1) * floor(abs(-1)) = -1;
让int32bit为posint modulo 2 32 ;也就是说,有限整数值k 具有正号且具有小于2 32 的数字类型 posInt和k的数学差异在数学上是一个 2 32 的整数倍。
int32bit = posInt mod 4294967296 = -1 mod 4294967296 = 4294967295
(wolfram alpha link for mathematical result)
如果int32bit大于或等于2 31 ,则返回int32bit - 2 32 , 否则返回int32bit。
由于4294967295 >= 2147483648
,我们会返回4294967295 - 4294967296
,即I.E。 -1
。
如果我们为ToInt32(1)
运行相同的步骤,我们会获得1
。所以他们没有相同的结果。