【发布时间】:2014-11-09 00:41:31
【问题描述】:
我在VHDL编程中遇到了这些语句,无法理解mod和rem这两个运算符之间的区别
9 mod 5
(-9) mod 5
9 mod (-5)
9 rem 5
(-9) rem 5
9 rem (-5)
【问题讨论】:
标签: vhdl
我在VHDL编程中遇到了这些语句,无法理解mod和rem这两个运算符之间的区别
9 mod 5
(-9) mod 5
9 mod (-5)
9 rem 5
(-9) rem 5
9 rem (-5)
【问题讨论】:
标签: vhdl
查看不同之处的一种方法是在测试台上运行快速模拟, 使用这样的过程的示例:
process is
begin
report " 9 mod 5 = " & integer'image(9 mod 5);
report " 9 rem 5 = " & integer'image(9 rem 5);
report " 9 mod (-5) = " & integer'image(9 mod (-5));
report " 9 rem (-5) = " & integer'image(9 rem (-5));
report "(-9) mod 5 = " & integer'image((-9) mod 5);
report "(-9) rem 5 = " & integer'image((-9) rem 5);
report "(-9) mod (-5) = " & integer'image((-9) mod (-5));
report "(-9) rem (-5) = " & integer'image((-9) rem (-5));
wait;
end process;
显示结果为:
# ** Note: 9 mod 5 = 4
# ** Note: 9 rem 5 = 4
# ** Note: 9 mod (-5) = -1
# ** Note: 9 rem (-5) = 4
# ** Note: (-9) mod 5 = 1
# ** Note: (-9) rem 5 = -4
# ** Note: (-9) mod (-5) = -4
# ** Note: (-9) rem (-5) = -4
Wikipedia - Modulo operation 有详细的描述,包括规则:
n 在 a mod n
a 在a rem n
mod 运算符给出向下舍入的除法(下除法)的余数,因此为 a = floor_div(a, n) * n + (a mod n)。优点是a mod n 是一个重复的锯齿图,当a 甚至从零开始增加时,这在某些计算中很重要。
rem 运算符给出了正则整数除法 a / n 的余数,它向 0 舍入(截断除法),所以是 a = (a / n) * n + (a rem n)。
【讨论】:
For equal sign:
9/5=-9/-5=1.8 gets 1
9 mod 5 = 9 rem 5
-9 mod -5 = -9 rem -5
-----------------------------------------
For unequal signs:
9/-5 = -9/5 = -1.8
In "mod" operator : -1.8 gets -2
In "rem" operator : -1.8 gets -1
----------------------------------------
example1: (9,-5)
9 = (-5*-2)-1 then: (9 mod -5) = -1
9 = (-5*-1)+4 then: (9 rem -5) = +4
----------------------------------------
example2: (-9,5)
-9 = (5*-2)+1 then: (-9 mod 5) = +1
-9 = (5*-1)-4 then: (-9 rem 5) = -4
----------------------------------------
example3: (-9,-5)
-9 = (-5*1)-4 then: (-9 mod -5) = -4
-9 = (-5*1)-4 then: (-9 rem -5) = -4
----------------------------------------
example4: (9,5)
9 = (5*1)+4 then: (9 mod 5) = +4
9 = (5*1)+4 then: (9 rem 5) = +4
【讨论】: