-5 / 2 = -2
-5 >> 1 = -3
我从老师那里了解到 >>1 将数字除以 2。它适用于正数,但不适用于负数。谁能给我解释一下??
谢谢
-5 / 2 = -2
-5 >> 1 = -3
我从老师那里了解到 >>1 将数字除以 2。它适用于正数,但不适用于负数。谁能给我解释一下??
谢谢
正如 BЈовић & 神秘状态,对负数使用位移运算符是实现定义的。
原因是 C 不区分逻辑位移和算术位移。
(具有最高有效位的算术填充,带 0 的逻辑填充)
对于正数这无关紧要,因为算术和逻辑位移都会将最高有效位保持为 0:
算术 5>>1
0000 0000 0000 0101
= 5
到
0000 0000 0000 0010
= 2
逻辑 5>>1
0000 0000 0000 0101
= 5
到
0000 0000 0000 0010
= 2
但是使用负数(2 的补偿)
算术 -5>>1
1111 1111 1111 1011
= -5
到
1111 1111 1111 1101
= -3
逻辑 -5>>1
1111 1111 1111 1011
= -5
到
0111 1111 1111 1101
= 32,765
或者至少,我是这样理解的
它适用于正数,但不适用于负数。
对负整数使用移位运算符是实现定义的。
[expr.shift]/3 告诉这个:
E1 >> E2 的值是 E1 右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有带符号类型和非负值,则结果的值是 E1/2E2 的商的整数部分。如果 E1 具有带符号类型和负值,则结果值是实现定义的。
首先,
二进制中的 5 是 0000 0000 0000 0101 但是 -5 呢?这里是 :
现在我们得到: -5= 1111 1111 1111 1011 (它是 2 的补码形式)
所以这里是如何计算 -5>>1 :
我猜是-5>>1 = -3的答案。如果是正数,比如 5,除以 2 会得到 2.5 四舍五入到最接近的最小整数,即 2
但是当我们考虑负数 -5 时,除以 2 得到 -2.5。它四舍五入到最接近的整数给出-3。
在c中,右移运算符保留符号位。因此,在保留符号位的情况下右移位再次产生一个负数,它是两个补码形式。
我认为答案是正确的。作为'/'(除法)运算符生成商(除法的结果)。
-5/2 = -3(quotient) and 1(remainder ).
所以这对正数和负数都可以。
5/2 = 2(quotient) and 1(remainder ).
所以用正数就可以了。
余数永远不会是负数。它始终是正数。