只是对二进制补码的工作方式有疑问。 例如(在python中):-
a = 60
print(~a)
提供输出:-
-61
60
的二进制补码不是:-
a = 0011 1100
〜a = 1100 0011
应该不是-60
吗?
我知道我错了,但是为什么它会前进到-61
?
答案 0 :(得分:1)
在所有现代计算机中,二进制补码2用于表示整数(而不是经典二进制表示)。 正如Python docs中确认的那样:
二进制补码与经典二进制相同 正整数的表示形式,但对于 负数。负数通过执行 对其绝对值进行二的补数运算。
使用(x-1)的位模式写一个负数的2的补码-x,所有位都被补充(从1切换为0或从0切换为1)。
示例: -15的2的补数:
-15 => complement(x-1) => complement(15-1) => complement(14) => complement(1110) => 0001
Python的〜(按位NOT)运算符返回数字的1的补码。
示例:
print(~14) # Outputs -15
14是2的补码二进制形式的(1110)。
此处,〜14会将这种形式的所有位都反转(即1的补码)为0001。 但是,0001实际上是-15的2的补数。
记住整数的按位NOT运算的简单规则是-(x + 1)。
print(~60) # Outputs -61
print(~-60) # Outputs 59
答案 1 :(得分:0)
您快到了。 1100 0011
实际上是-61
。
以下是将负二进制文件转换为十进制的方法:
反转位
加1
转换为十进制
添加负号
所以:
1100 0011
0011 1100 <-- bits inverted
0011 1101 <-- one added
61 <-- converted to decimal
-61 <-- added negative sign
摘自维基百科的Two's complement page:
N位数字的二进制补码定义为相对于2 ^ N的补码。例如,对于三位数字010,由于010 + 110 = 1000,所以两者的补码为110。
1100 0011
的补码为0011 1101
cuz
1100 0011
+ 0011 1101
-------------
1 0000 0000
答案 2 :(得分:0)
~
是按位求反运算符,it acts exectly as defined:
x的按位求反定义为-(x + 1)。
这就是整数two's complement representation的按位求反的原理。
两个补码轮很好地显示了这一点:
如您所见,按位倒数1为-2,按位倒数2为-3,...,而按位倒数60为-61。