Verilog 中的 % 取余数运算(取模),看到这个题目的时候还真不确定选哪个答案。
13. Verilog 中 -10%3 的结果是多少?
A. 2
B. -2
C. 1
D. -1
答案:D
解析:
Verilog 的 %,求余数:
10 % 3 = 1
-10 %3 = -1
10 % (-3) = 1
-10 %(-3) = -1
Verilog 里的模运算,先把各自符号位去掉运算,然后取第一个运算数的符号位,即都直接算 10 % 3 = 1,然后如果前面是 10 模式就是 1,前面是 -10 模值就是 -1;
余数符号跟随被除数的符号位。
C语言的 %,求余数:
和 Verilog 一样,余数符号跟随被除数的符号位。
先去掉符号取余数,被除数是正数,则余数为正数;被除数为负数,则余数为负数。
Matlab 的 rem,求余数:
r = rem(a, b),返回的 r 是 a 除以 b 后的余数。
该结果与 Verilog 和 C 语言的 % 结果一致:
余数符号跟随被除数的符号位。
这里特别注意 Matlab 中的 mod 取模运算,以前经常把 % 叫做取模,计算方式不一样。
Matlab 的 mod,求余数:
mod(10 , 3) = 1,10 = 3*3 1,商为 3,余数为 1
mod(-10 , 3) = 2,-10 = -4*3 2,商为 3,余数为 2
mod(10 , -3) = -2,10 = (-4)*(-3) (-2),商为 -4,余数为 -2
mod(11 , -3) = -1,11 = (-4)*(-3) (-1),商为 -4,余数为 -1
mod(-10 , -3)= -1,-10 = 3*(-3) (-1),商为 3,余数为 -1
商尽量往小取,当商为正数,就是数值越小越好,当商为负数,就往取绝对值后比较大的方向取,即都向着负无穷方向取。
余数符号跟随除数的符号位。
mod 和 rem 的区别
除后所得余数的概念的定义不是唯一的,两个函数 mod 和 rem 计算不同的结果。
mod 函数生成一个为零或与除数具有相同符号的结果。
rem 函数生成一个为零或与被除数具有相同符号的结果。
另一个差别是当除数为零时的约定。mod 函数遵从 mod(a,0) 返回 a 的约定,而 rem 函数遵从 rem(a,0) 返回 NaN 的约定。
两个结果都有其各自的用途。例如,在进行信号处理时,mod 函数可在周期信号上下文中使用,因为其输出是周期性的(周期等于除数)。