我有下一个代码:
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)
但为什么?
-1是1111 1111(1个字节),-1 >>1必须是:1011 1111它不是-1或0!(符号位没有移位,我知道)
有人可以向我解释这是如何工作的吗?
ice*_*ime 24
标准5.8/3(换档操作员):
E1 >> E2的值是E1右移E2位位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1的商除以提升到功率E2的数量2的积分.如果E1具有带符号类型和负值,则结果值是实现定义的.
那么对于"为什么?"这个问题,标准答案是:为什么不呢.
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)
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |