为什么-1 >> 1是-1?而1 >> 1是0!

Max*_*Max 16 c++

我有下一个代码:

std::cout << (-10 >> 1) << std::endl;
std::cout << (-9 >> 1) << std::endl;
std::cout << (-8 >> 1) << std::endl;
std::cout << (-7 >> 1) << std::endl;
std::cout << (-6 >> 1) << std::endl;
std::cout << (-5 >> 1) << std::endl;
std::cout << (-4 >> 1) << std::endl;
std::cout << (-3 >> 1) << std::endl;
std::cout << (-2 >> 1) << std::endl;
std::cout << (-1 >> 1) << std::endl;
Run Code Online (Sandbox Code Playgroud)

结果是:

-5
-5
-4
-4
-3
-3
-2
-2
-1
-1
Run Code Online (Sandbox Code Playgroud)

但为什么?

-11111 1111(1个字节),-1 >>1必须是:1011 1111它不是-10!(符号位没有移位,我知道)

有人可以向我解释这是如何工作的吗?

ice*_*ime 24

标准5.8/3(换档操作员):

E1 >> E2的值是E1右移E2位位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1的商除以提升到功率E2的数量2的积分.如果E1具有带符号类型和负值,则结果值是实现定义的.

那么对于"为什么?"这个问题,标准答案是:为什么不呢.

  • 标准答案是:"编译器的RTFM" (8认同)

Jas*_*n S 17

右移负数是实现定义的.

将符号扩展位移到最左边位的实现,按照您的报告工作.

至于为什么这样做,这是因为右移可以用2除以圆的朝向负无穷大(如同floor())舍入行为:

(-8 >> 2) == -2
(-9 >> 2) == -3
(-10 >> 2) == -3
(-11 >> 2) == -3
(-12 >> 2) == -3
Run Code Online (Sandbox Code Playgroud)

看到这个问题.