正数和负数的按位运算符

Com*_*erd 8 c++ bitwise-operators

    -5 / 2 = -2

    -5 >> 1 = -3
Run Code Online (Sandbox Code Playgroud)

我向老师学习>> 1将数字除以2.它对正数有效,但对负数不起作用.有人可以向我解释一下吗?

谢谢

Dab*_*zuk 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的比较)
算术-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

或者至少,这就是我理解它的方式


BЈо*_*вић 5

它适用于正数,但不适用于负数.

在负整数上使用移位运算符是实现定义的.


[expr.shift]/3告诉我:

E1 >> E2的值是E1右移E2位位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1/2E2的商的整数部分.如果E1具有带符号类型和负值,则结果值是实现定义的.

  • 错了,它是实现定义的.没有定义. (2认同)