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

安尼班·辛哈

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

输入:5 输出:-6

#include <iostream>

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

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

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

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

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

如果然后从 -1 中减去 1,则得到0b11111111 - 0b00000001 == 0b11111110 == -2但是2 == 0b00000010,这显示了为什么-2 != ~2(并且相同的规则适用于下一个值)。


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么awk'NR%2 == 1?ORS =“;” :: ORS =“ \ n”'给出语法错误?

为什么python中的\n给出两个空行?

Java程序没有给出n> 6的输出,为什么?

3n + 1给出负数

为什么`&n` 和`&n + 1` 相差`4` 而不是`1`?

f = lambda n:(1,f(n-1)* n)[n> 1]在Python 3中给出RunTimeError

为什么第二行执行n(n + 1/2)

为什么交叉应用给出所有行而不是前N个

为什么此代码打印第n个数字会给出运行时错误?

为什么在Javascript中1 =='1 \ n'为真?

为什么“ head -1”不等同于“ head -n -1”,而是与“ head -n 1”相同?

为什么冒泡排序外循环以n-1结尾?

为什么n + 1选择模式比较慢?

为什么“ n&1 == 0”总是返回false?

为什么(n / 2)-1在堆排序中?

为什么Matlab引导程序评估N + 1次?

为什么random.nextInt()创建“ IllegalArgumentException:n <= 0:-1”?

为什么“ n&1 == 0”总是返回false?

为什么是1:M而不是N:M(ER图)

为什么 findAncestorWidgetOfExactType 是 O(N) 而dependOnInheritedWidgetOfExactType 是 O(1)

为什么右移-1在PHP中总是给出-1?

为什么计算1 /(n * log(n)-n)会损坏计算机?

N> 1 goroutines的结果不同(在N> 1 Cpu:s上)。为什么?

为什么用arr [:] [np.newaxis] .shape =(1,n)而不是(n,1)?

为什么我在返回F(n-1,t)+ F(n,t-1)行时出错?

为什么用list.add嵌套循环给出为O(n ^ 4)的时间复杂度?

为什么bash“ test -n”命令在“!test -z”工作时给$ @(美元)位置参数给出错误的结果?

为什么调用 python 列表的 [-1] 会给出这个输出?

为什么32767 + 1在Turbo C中给出-32768?