为什么 ~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表示负数(-)
- 010 = 6
因此,输出为-6
因为这是一个 2 的补码机
我想测试一下当我写这段代码时会发生什么。我无法解释以下情况:
输入: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表示负数(-)
- 010 = 6
因此,输出为-6 因为这是一个 2 的补码机