为什么 ~n 给出 -(n+1)?

Why does ~n give -(n+1)?

我想测试一下当我写这段代码时会发生什么。我无法解释以下情况:

输入:5 输出:-6

#include <iostream>

int lastBit(int n){   return ~(n); }

int main() {   std::cout << lastBit(5); }

不是在所有系统上,而是在使用两个补码作为有符号值的系统上。根据那里的定义,负数 X = -n 的二进制表示形式是 ~n + 1,其中 n 是一个正整数,它允许有符号和无符号加法运算相同。

C++20 之前,~(n) 的带符号负值 n 的结果在这里是未定义的,因为它取决于平台和编译器。在 C++20 中,它需要表现得好像使用了二的补码。

计算机以非常特殊的方式表示负数。值总是存储为一系列位,并且无法引入负号,因此必须以不同的方式解决:其中一位扮演负号的角色。

但这还不是全部 - 系统的设计必须能够正确处理数学(理想情况下,与处理正数的方式相同)。

例如0 == 0b00000000。如果你从 0 中减去 1,你会得到 -1,但是从二进制的角度来看,由于“二进制下溢”,0b00000000 - 0b00000001 == 0b11111111,因此 0b11111111 == -1.

如果你从 -1 中减去 1,你会得到 0b11111111 - 0b00000001 == 0b11111110 == -2。但是 2 == 0b00000010,这说明了为什么 -2 != ~2(同样的规则适用于下一个值)。


非常简短但可能更直观的答案可能是:“-5 != ~5,因为二进制只有一个零(例如 0 == -0),所以总是多一个负值比积极的

我发现了以下内容

5 = 0101 因此,~(5) = 1010

  1. 最高位的1表示负数(-)
  2. 010 = 6

因此,输出为-6 因为这是一个 2 的补码机