有点巧,突然收到这么一个问题?
~21 为什么的结果是 -22?
cout << ~21 << endl;
结果是:-22
我的回答:不是一个公式嘛?~x=-(x+1)(其实一直以来我也只知道这个公式)
突然这问原理给我整懵了,我也不知道咋解释,于是研究了一波。
下面是解释:
首先需要明确的一点是:
在计算机中,这些数都是以补码的形式存储在内存中的。
原码变反码:数的符号位不变,其它位均按位取反
非运算:连同数的符号位,所有位均按位取反
那么ok,计算"-21"
(int 有32位)
21的二进制是:
0000 0000 0000 0000 0000 0000 0001 0101
~21的二进制是:
1111 1111 1111 1111 1111 1111 1110 1010
cout << ~21 << endl; //这样子输出的是~21的十进制
1111 1111 1111 1111 1111 1111 1110 1010 (这个是补码)
要得到原码的十进制就需要转换。
原码变补码:取反加一
补码变原码:减一取反(符号位不取反)
减一:1111 1111 1111 1111 1111 1111 1110 1001
取反:1000 0000 0000 0000 0000 0000 0001 0110
即:结果为:-22