移位操作

正数的移码 移位规则:
数符不变:(单:符号位不变,双:第1符号位不变)
空位补0:(右移时第二符号位移至尾数最高位)
(1)对无符号数3来说:

3的二进制表示 0000 0011
x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成00000110,所以结果是6;[1*2^2 + 1*2^1 + 0*2^0 = 6]

x>>1往右边移一位,由于是无符号数,所以逻辑右移,最右边一位移掉,最左边移进来的位补零,变成00000001,所以结果是1。[1*2^0 = 1]

(2)对于有符号数3来说:
数符不变:(单:符号位不变,双:第1符号位不变)
左移空位补0
右移空位补1

x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成00000110,所以结果是6;

x>>1往右边移一位,由于是有符号数,可能发生逻辑右移,也可能发生算术右移,这一点,C标准并没有明确地指定是使用逻辑右移还是算术右移。但大多数的机器都使用算术右移,变成00000001,所以结果还是1。

负数的移码规则:

(3)对于有符号数-3来说:

-3 的二进制表示:负数的二进制在计算机当中以补码的形式存在 1111 1101
x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成1111 1010,结果是-6;[-(1*2^2 + 0*2^1 + 1*2^0 +1) = -6]

x>>1往右移一位,由于是有符号数,可能发生逻辑右移,也可能发生算术右移。大多数机器使用算术右移,变成1111 1110,结果是-2。[-(1*2^0 +1) = -2]

单双符号位:

双符号位补码”又称为“[变形补码]

双符号位判决法
计算机运算溢出检测机制,采用双符号位,00表示正号,11表示负号。如果进位将会导致符号位不一致,从而检测出溢出。结果的符号位为01时,称为上溢;为10时,称为下溢。
例如设X = + 1000001,Y = + 1000011,采用双符号位表示X=00 1000001,Y=00 1000011,[X + Y]补=01 0000100,实际上,运算结果产生了正溢出。

参考:
https://www.cnblogs.com/huangjianwu/p/4549085.html

你可能感兴趣的:(移位操作)