-5 / 2 = -2
-5 >> 1 = -3
我向老师学习>> 1将数字除以2.它适用于正数,但不适用于负数。有人可以向我解释一下吗?
由于
答案 0 :(得分:6)
作为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的comp)
算术-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
或者至少,这是我理解的方式
答案 1 :(得分:5)
它适用于正数,但不适用于负数。
对负整数使用移位运算符是实现定义的。
[expr.shift] / 3告诉我:
E1的值>> E2是E1右移E2位位置。如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1 / 2E2的商的整数部分。如果E1具有有符号类型和负值,则结果值是实现定义的。
答案 2 :(得分:1)
我向老师学习>> 1将数字除以2.
它不会将整数除以2,但它会执行(取决于值) 右边一位logical或arithmetic shift。在某些情况下,它恰好等于两分。
它适用于正数,但不适用于负数。
在两种情况下都可以正常工作,但确切的行为不是标准规定的,而是实现定义的。它通常除以2并将结果截断为负无穷大,与正常除法相反,向零逼近。
供参考:
答案 3 :(得分:1)
首先,
二进制5是0000 0000 0000 0101
但-5怎么样?这是:
现在我们得到:-5 = 1111 1111 1111 1011(以2的补码形式)
所以这是如何计算-5>> 1:
答案 4 :(得分:0)
我认为答案是正确的。由于'/'(除法)运算符生成商(除法结果)。
-5/2 = -3(quotient) and 1(remainder ).
所以正数和负数都可以。
5/2 = 2(quotient) and 1(remainder ).
所以没有正数。但
永远不会是负数。它总是正数。
答案 5 :(得分:0)
我猜答案是-5>> 1 = -3。 在正数(例如5)的情况下,除以2得到2.5舍入到最接近的最小整数,即2
但是当我们考虑负数-5时,除以2给出-2.5。它四舍五入到最接近的整数给出-3。
答案 6 :(得分:0)
在右移位运算符中保留符号位。然后右移位保留符号位再次产生一个负数,这是两个补码形式。