Com*_*erd 8 c++ bitwise-operators
-5 / 2 = -2
-5 >> 1 = -3
Run Code Online (Sandbox Code Playgroud)
我向老师学习>> 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具有带符号类型和负值,则结果值是实现定义的.
| 归档时间: |
|
| 查看次数: |
10291 次 |
| 最近记录: |