关于原码、反码和补码的笔记

上来先敲黑板,说重点(重要的事情说三遍):
  • 计算机中以补码进行存储计算
  • 计算机中以补码进行存储计算
  • 计算机中以补码进行存储计算

所以,一切的运算都要先得到数据的补码,不要上来就拿原码在那干,得到的结果会漫天飞舞,正负数一起算会算到你怀疑人生。。可以尝试将十进制数字的二进制打印出来看看,正数还算正常,负数的那玩意是什么鬼(e.g. -3=11111111111111111111111111111101)。。


正数

正数的原码、反码和补码都一样(不要问我为什么,就是这么规定的。。我也很无奈啊。。)


负数

负数的反码是符号位不变,其余为取反。负数的补码是其反码加一。


负数的计算方式,注意这里是算负数即计算(~X + 1),以计算8的负数为例:
  • 8的二进制表示为1000,由于是正数,手动在前面补零,变为:01000
  • 由于正数的补码为本身,所以其补码为:01000
  • 取反运算:01000按位取反,得到10111,那么10111是哪个幸运儿的补码呢?
  • 由于正数的补码最高位肯定是0,而此时的10111最高位为1,那么它铁定是一个负数的补码
  • 负数的补码计算方式是:原码->除最高位外按位取反得反码->反码加一
  • 反之,求原码的方式就变为:补码减一->除最高位外按位取反
  • 10111,减一得到10110,除最高位按位取反:11001,即-9
  • 结果就出来了:-9 + 1 = -8,即-X = ~X + 1

补充

还有需要说明的一点,以正数6为例,它的二进制是0110加上一位符号位,标记为00110(标记一位和补全为8位似乎都一样,我习惯多加一位,好理解),由于正数的反码和补码都与原码相同,所以6的反码和补码都是00110。但是~6的结果是-7。这里需要注意,反码取反 并不是一回事。另外取反和负数也不是一回事

注意逻辑思维:对于正数A求(~A)的过程是:A转二进制,求到A的补码,按位取反,假定得到的结果是X,那么X是要求的结果B的补码,接下来就要想办法求B。即公式:A补反 = B补


附录
~9的计算步骤:
转二进制:0 1001
计算补码:0 1001
按位取反:1 0110
_____
转为原码:
按位取反:1 1001   
末位加一:1 1010
符号位为1是负数,即-10

--snip--

~-9的计算步骤:
转二进制:1 1001
计算补码:1 0111
按位取反:0 1000
_____
转为原码:
正数的补码和原码相同,仍为:0 1000,即8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章