The*_*ain 2 c bit-manipulation
我正在阅读"K&R的C语言".现在我正在做按位节.我很难理解以下代码.
int mask = ~0 >> n;
Run Code Online (Sandbox Code Playgroud)
我正在使用它来掩盖另一个二进制文件的左侧像这样.0000 1111 1010 0101 //随机数
我的问题是当我打印var mask时它仍然是负-1.假设n是4.我认为移位〜0这是-1将是15(0000 1111).
谢谢你的回答
对负值执行右移会产生实现定义的值.1正如您在案例中看到的那样,大多数托管实现将在左侧移位,但不一定是这种情况.
无符号类型以及带符号类型的正值在0向右移位时始终在左侧位移位.因此,您可以使用无符号值来获得所需的行为:
unsigned int mask = ~0u >> n;
Run Code Online (Sandbox Code Playgroud)
C标准的 6.5.7节中记录了此行为:
5 E1 >> E2的结果是E 1右移E2位的位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1/2 E2的商的整数部分.如果E1具有有符号类型和负值,则结果值是实现定义的.