举例说明逻辑左移、算术左移、逻辑右移、算术右移

 前言

首先需要明确几个概念:

1.计算机操作的都是补码。

2.正数的补码和原码相同,负数的补码等于原码取反后+1.

3.需要先确定位数(如8位、16位、32位),因为有可能会出现溢出的情况。

 

逻辑左移

 逻辑左移是不考虑符号的左移操作。它用于对无符号整数进行左移。

在逻辑左移中,所有位都向左移动,不考虑符号位。

逻辑左移将左边空出的位用0填充。

例如原始:00000010 ----- 2

左移二位:00000100 ----- 4

 

算术左移

算术左移是带符号左移操作。它用于对带符号整数进行左移,保持数的符号位不变。

在算术左移中,最高位(符号位)的值会在左移时保持不变。左移后的空位用零填充。

在不溢出的情况下相当于乘以2。 

算术左移与逻辑左移相似,但对于有符号整数,它保留了符号位。 

例如原始:11111110 ----- -2

左移一位:11111100 ----- -4

注意:在不溢出的前提下(如8位的范围是-128-127),算术右移和逻辑右移的结果一样。

逻辑右移

逻辑右移是不考虑符号位的右移操作。它用于对无符号整数进行右移。

逻辑右移中,所有位都向右移动,不考虑符号位

最高位(符号位)在逻辑右移时被填充为0。

逻辑右移通常用于无符号数值的无损压缩。

逻辑右移将右边空出的位用0填充。

例如原始:11111100 ----- -4

右移一位:01111110 ----- 126

可见逻辑右移会改变负数

 

算术右移

算术右移是带符号右移操作。它用于对带符号整数进行右移,保持数的符号位不变。

在算术右移中,最高位(符号位)的值会在右移时保持不变。右移后的空位用符号位填充。

算术右移通常用于有符号整数的操作,以保持符号的正确性。

在不溢出的情况下相当于除以2。

算术右移与逻辑右移相似,但对于有符号整数,它保留了符号位

例如原始:11111100 ----- -4

右移一位:11111110 ----- -2

 

举例说明 

举例说明逻辑左移、算术左移、逻辑右移、算术右移_第1张图片

通过这张图可以很直观地看出很多关系,比如不溢出的情况下算术左移一位相当于乘以2、不溢出的情况下算术右移相当于乘以2、负数的原码相当于正数的原码将符号数改为1、负数的原码取反+1得到补码、正数的原码反码补码均相等......

 (by 归忆)

你可能感兴趣的:(深大C语言,深圳大学,c语言,算术左移,逻辑左移,算术右移,逻辑右移)