Verilog 中负数的 % 取余数运算、C语言、Matlab各自的取余数运算【%】【mod】【rem】

2021-05-26 11:49:49 浏览数 (1)

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 函数可在周期信号上下文中使用,因为其输出是周期性的(周期等于除数)。

0 人点赞