C 语言中负数移位运算讲解

C 语言中负数移位运算讲解
“<<”、“>>”为移位运算符。 “<<”为左移位运算符,即数据字节中的每个二进制位同时
向左移位。如“x<>”为右移位运算
符,即数据字节中的每个二进制位同时向右移位。如“x>>n”表示 x 中的每个二进制位同时
向右移动 n 位。
下图演示了一个 2 字节变量左移 3 位的过程:
十进制数-555 的二进制表:
1 0  0 0  0  0 1  0 0  0  1 0  1 0  1 1
先转换成二进制补码表:
1 1  1 1  1  1 0  1 1  1  0 1  0 1  0 0
最左端位保持不变 补码加“1”后状态
再将补码加“1”:
1 1  1 1  1  1 0  1 1  1  0 1  0 1  0 1
下一步向左移 3 位:
1 1  1 0  1  1 1  0 1  0  1 0  1 0  0 0
左端“离开”3 位丢弃 右端“移入”3 位用“0”补齐
最左端一位保持不变
再转换成二进制补码表:
1 0  0 1  0  0 0  1 0  1  0 1  0 1  1 1
补码再加“1”:
到此步结束。
1 0  0 1  0  0 0  1 0  1  0 1  1 0  0 0
补码加“1”后状态
结果转换成十进制数为“- 4440”。
总结:负数左移时,任何情况下“移入”位将用“0”补齐。
“>>”右移位运算可分为两种情况:一种是移入“0”的叫逻辑右移;一种是移入“1”的叫
算术右移。 负数右移用到的是算术右移。
下图演示了一个 2 字节变量右移 3 位的过程:
十进制数-555 的二进制表:
1 0  0 0  0  0 1  0 0  0  1 0  1 0  1 1
先转换成二进制补码表:
1 1  1 1  1  1 0  1 1  1  0 1  0 1  0 0
最左端位保持不变 补码加“1”后状态
再将补码加“1”:
1 1  1 1  1  1 0  1 1  1  0 1  0 1  0 1
下一步向右移 3 位:
1 1  1 1  1  1 1  1 1  0  1 1  1 0  1 0
左端“移入”3 位用“1”补齐 右端“离开”3 位丢弃
最左端一位保持不变
再转换成二进制补码表:
1 0  0 0  0  0 0  0 0  1  0 0  0 1  0 1
补码再加“1”:
到此步结束。
1 0  0 0  0  0 0  0 0  1  0 0  0 1  1 0
补码加“1”后状态
结果转换成十进制数为“- 70”。
总结:负数右移时,任何情况下“移入”位将用“1”补齐。
注:二进制表最左端的二进制位表示符号位,“+”用“0”表示,“-”用“1”表示。
 

你可能感兴趣的:(C 语言中负数移位运算讲解)