算术移动和逻辑移动

本文详细解释了算术左移、逻辑左移、算术右移和逻辑右移的区别及其应用场景。算术移位主要用于处理有符号数的倍增和减半,而逻辑移位则用于无符号数的类似操作。此外还介绍了计算机系统中常用的移位方式。

算术左移、逻辑左移、算术右移、逻辑右移有什么不同?

算术左移:末尾添0;

逻辑左移:末尾添0;

算术右移:左端最低位填充;

逻辑右移:左端添0。

 

算术左移和算术右移主要用来进行有符号数的倍增、减半;
逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半.

 

算术左移和算术左移虽然方式是一样的,但他们表示的移位后数的范围是不一样的,有符号数左移(算术左移)位后的范围是-128——127【指8位】.而无符号数(算术左移)左移的范围是0——255.【指8位】

 

计算机系统一般都是算术移动。


算术左移和逻辑左移是相同的,它们只在右移时不同,而且只有当操作数是负值时才不一样。

操作数都是整型类型。



### Verilog 中算术右移逻辑右移的区别 在 Verilog SystemVerilog 编程过程中,当涉及左移右移操作时,区分算术移位与逻辑移位非常重要。这两种类型的移位处理方式不同,在某些情况下可能导致不同的结果。 #### 算术右移 (ASR) 对于有符号数而言,算术右移保持最高有效位(即符号位),并将其复制到左侧新腾出来的位置上。这意味着如果原始数值是一个负数,则其二进制表示形式中的最左边几位会被填充为1;如果是正数则被填0[^3]。这种特性使得算术右移适用于维持原数据的符号属性不变的情况下缩小绝对值大小。 例如,考虑一个5比特宽的数据`11000`代表十进制下的-8(假设采用补码表示法)。对其进行一次算术右移后的结果将是`11100`,这对应于新的十进制值-4。 ```verilog // 示例:算术右移 module arith_shift_right ( input wire [4:0] data_in, output reg [4:0] data_out ); always @(*) begin data_out = $signed(data_in) >>> 1; end endmodule ``` #### 逻辑右移 (LSR) 相比之下,逻辑右移总是向右侧移动每一位并将空出的位置用零填补,而不关心输入数据是否有符号性质。因此,无论初始状态如何,执行逻辑右移之后得到的结果都将被视为无符号整型量的一部分。 继续上面的例子,同样是对`11000`这个五比特序列应用单次逻辑右移操作会获得`01100`作为最终输出,它不再保留原有的符号信息而仅仅作为一个纯数字看待。 ```verilog // 示例:逻辑右移 module logic_shift_right ( input wire [4:0] data_in, output reg [4:0] data_out ); always @(*) begin data_out = data_in >> 1; end endmodule ``` #### 特殊情况说明 值得注意的是,当处理非负数或全零模式下,两种右移产生的效果相同——都是简单地除以2^n的形式改变数值规模。然而一旦遇到带有符号特性的数据集时二者之间就会显现出差异性了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值