电商系统随着业务发展必然趋于复杂,架构师在什么情况下应该追求"简单",什么情况下必须接受"复杂"?
-1被存储为所有位都设置为1的值。如果我们留在8位示例中,则-1等于11111111.因此,-1^1
给出以下结果:
11111111
00000001
--------
11111110
这等于-2。当你用另一个减号反转它时,你得到2。
负数以我们称之为数的二进制补码的方式存储。如果你想在脑海中快速计算它,你可以翻转你的数字的正面等值的所有位,并添加一个。因此对于-1:
1: 00000001
--------
11111110
+ 1
--------
-1: 11111111
解释为什么-1被存储为11111111。
该表达式由编译器解释为:
-((-1)^1)
它是: - ((11111111)XOR(00000001))= - (11111110)= - ( - 2)= 2
要理解为什么编译器选择-((-1)^1)
,而不是-(-(1^1))
,最相关的部分是一元运算-
符(粗体): - (- 1 ^ 1))比XOR运算符具有更高的优先级^
。因此,否定发生在XOR之前,我们最终结束-((-1)^1)
。
我在这里每个整数使用8位。通常你应该期望每个数字有32或64位,但在这种情况下它是不相关的;
为了更好地理解为什么11111111是-1和11111110是-2,请阅读有关二进制补码的更多信息 - https://en.wikipedia.org/wiki/Two%27s_complement。
简而言之,你将所有位从最左侧开始视为2的连续幂。最左侧的位被视为下一个功率,但是为负。
例:
10001100 = 1 * (-(2^7)) + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0