无符号右移和右符号右移_20210125

转载链接:无符号右移有符号右移

计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负

有符号右移

若正数,高位补0,负数,高位补1 -> 一句话概括:高位补符号位

正数

例如:8 >> 2
偶数情况
8的二进制为 0000 0000 0000 0000 0000 0000 0000 1000
右移两位后 0000 0000 0000 0000 0000 0000 0000 0010
结果为2,右移n位8/(2^n)

如果是奇数呢
9的二进制为 0000 0000 0000 0000 0000 0000 0000 1111
右移两位后 0000 0000 0000 0000 0000 0000 0000 0011
结果为3,右移n位近似等于9/(2^n)

负数

-8的二进制为 1000 0000 0000 0000 0000 0000 0000 1000(原码)
然后写出补码 1111 1111 1111 1111 1111 1111 1111 1000(补码)
计算补码的方式为反码+1,用一句话概括就是:保证符号位不变,其余位置取反加1(从右往左遇到第一个1,然后剩下的全部取反就是了)
右移两位后 1111 1111 1111 1111 1111 1111 1111 1110(补码)
1111 1111 1111 1111 1111 1111 1111 1111(补码+1)
1000 0000 0000 0000 0000 0000 0000 0000(补码+1取反)
根据补码写出原码才是我们所求的结果, 保留符号位,然后按位取反再加上1
1000 0000 0000 0000 0000 0000 0000 0010(补码的补码,即原码)
结果为:-2

无符号右移

不论正负,高位均补0

正数:

例如8 >>> 2
与8 >> 2的运算相同,结果也为1

负数:

例如-8 >>> 2
首先写出-8的二进制数,因为是负数所以最高位为1
1000 0000 0000 0000 0000 0000 0000 1000

然后写出-8补码:保证符号位不变,其余位置取反加1(从右往左遇到第一个1,然后剩下的全部取反就是了)

1111 1111 1111 1111 1111 1111 1111 1111 1000(补码)

右移2位: 在高位补0

0011 1111 1111 1111 1111 1111 1111 1111 1110

结果为:即1073741822

总结:

  • “有符号”右移位运算符 >>(保留最高位符号位)
  • “无符号”右移位运算符 >>>(不保留最高位符号位,最高位始终补 0)
  • 另外需要知道,计算机里负数是用补码(取反加一)来表示。所以:对于正数 >> 和 >>> 是一样的,而 对于负数则不同。

猜你喜欢

转载自blog.csdn.net/a18829292719/article/details/113104903