该位操作符代码是副作用(在K&R C书中使用的术语)还是机器相关的处理指令?

Abh*_*rya 4 c bit-manipulation

这是两个似乎在做相同事情的代码,但事实并非如此。运行和将输出与跟踪进行比较时,这两个不同的输出产生了混淆,因为似乎第一个代码处理是与机器相关的代码。请阅读两个代码

代码1:-

unsigned char c=(((~0 << 3) >> 4) << 1);
printf("%d", c);
Run Code Online (Sandbox Code Playgroud)

输出:-254

代码2:-

unsigned char c=(~0 << 3);
c >>= 4;
c <<= 1;
printf("%d", c);
Run Code Online (Sandbox Code Playgroud)

输出:-。30

上面代码的输出是不同的。

不仅此代码(第一个代码)引起混淆,而且涉及单行多位按位移位运算符的所有类型的代码都产生意外结果。

第二个代码执行正确。

请在您的计算机上运行此代码并验证以上输出

与/或

解释为什么这些输出不相同。

要么

最后,我们必须了解我们不应在代码中应用多个按位移位运算符。

谢谢

Lun*_*din 11

~0 << 3 始终是一个错误,没有一个例子是正确的。

  • 0int已签名的类型。
  • ~0会将二进制内容全部转换为:0xFF...FF
  • 当您将数据移入有符号整数的符号位时,将调用未定义的行为。如果左移负整数也是一样。

结论:这两个示例都没有确定性的输出,并且都可能崩溃或打印垃圾。