我有C代码,我在其中执行以下操作.
int nPosVal = +0xFFFF; // + Added for ease of understanding
int nNegVal = -0xFFFF; // - Added for valid reason
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试
printf ("%d %d", nPosVal >> 1, nNegVal >> 1);
Run Code Online (Sandbox Code Playgroud)
我明白了
32767 -32768
Run Code Online (Sandbox Code Playgroud)
这是预期的吗?
我能够想到类似的东西
65535 >> 1 = (int) 32767.5 = 32767
-65535 >> 1 = (int) -32767.5 = -32768
Run Code Online (Sandbox Code Playgroud)
也就是说,-32767.5四舍五入为-32768.
这种理解是否正确?
我偶然发现了一个问题,询问你是否曾经不得不在实际项目中使用位移.我在许多项目中都使用了相当广泛的位移,但是,我从来不必使用算术位移,即位移,其中左操作数可能是负的,符号位应该移位而不是零.例如,在Java中,您将使用运算>>
符进行算术位移(同时>>>
执行逻辑移位).在经过深思熟虑之后,我得出的结论是,我从未使用>>
过可能为负的左操作数.
正如本回答中所述,算术移位甚至是在C++中定义的实现,因此与Java相比 - 在C++中甚至没有用于执行算术移位的标准化运算符.答案还说明了一个有趣的问题,我甚至都没有意识到负面数字的变化:
+63 >> 1 = +31 (integral part of quotient E1/2E2)
00111111 >> 1 = 00011111
-63 >> 1 = -32
11000001 >> 1 = 11100000
Run Code Online (Sandbox Code Playgroud)
因此,当看到这些位时,-63>>1
收益率-32
是显而易见的,但也许不是大多数程序员一见钟情的预期.更令人惊讶的是(但在查看位时再次显而易见)-1>>1
是-1
,不是0
.
那么,可能负值算术右移的具体用例是什么?