C 按位运算符示例

C Bitwise Operators Example

给定以下函数:

int boof(int n) {
    return n + ~n + 1;
}

这个功能是什么return?我无法准确理解传递给它的内容。如果我调用 boof(10),它会将 10 转换为基数 2,然后对二进制数进行按位运算吗?

这是我最近做的一道题,我认为答案应该是0,但我不确定如何证明。

注意:我知道每个按位运算符是如何工作的,但我对输入的处理方式更加困惑。

谢谢!

按位运算不会将数字的基础表示更改为基数 2 - CPU 上的所有数学运算无论如何都是使用二进制运算完成的。

这个函数所做的是取 n,然后将其添加到自身的二进制补码负表示中。这基本上否定了输入。您输入的任何内容都将等于 0。

让我用 8 位数字来解释,因为这更容易形象化。

10 在二进制中表示为 00001010。

负数存储在补码中(记数加1)

所以 10 的 (~n + 1) 部分看起来像这样:

11110101 + 1 = 11110110

所以如果我们取 n + ~n+1:

00001010 + 11110110 = 0

注意,如果我们将这些数字加在一起,我们会得到一个左进位,这将设置溢出标志,结果为 0。(将负数和正数加在一起绝不意味着溢出表示异常!)

看到这个 The CARRY and OVERFLOW flag in Binary Arithmetic

nint 时,n + ~n 将始终导致所有位都已设置的 int

严格来说,向这样的 int 加 1 的行为将取决于平台上符号数的表示。 C 标准支持 signed int 的 3 种表示形式:

  • 对于二进制补码机(当今使用的绝大多数系统),结果将为 0,因为所有位设置的 int 为 -1。

  • 在 One's Complement 机器上(我相信这在今天非常罕见),结果将为 1,因为 int 所有位设置为 0 或 -0(负零) ) 或未定义的行为。

  • a 有符号幅度机器(真的有这些机器还在使用吗?),一个设置了所有位的 int 是一个具有最大幅度的负数(所以实际值将取决于 int) 的大小。在这种情况下,将其加 1 将得到一个负数(确切的值,同样取决于用于表示 int 的位数)。

请注意,以上内容忽略了某些实现可能会陷入 n + ~n.

可能出现的各种位配置的情况