相关疑难解决方法(0)

右移C中的负数

我有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.

这种理解是否正确?

c bit-shift negative-number

26
推荐指数
3
解决办法
4万
查看次数

算术右移位有哪些实际用例?

我偶然发现了一个问题,询问是否曾经不得不在实际项目中使用位移.我在许多项目中都使用了相当广泛的位移,但是,我从来不必使用算术位移,即位移​​,其中左操作数可能是负的,符号位应该移位而不是零.例如,在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.

那么,可能负值算术右移的具体用例是什么?

c c++ java bit-manipulation bit-shift

5
推荐指数
2
解决办法
1088
查看次数

标签 统计

bit-shift ×2

c ×2

bit-manipulation ×1

c++ ×1

java ×1

negative-number ×1