原码、反码、补码

好记性不如烂笔头,想当年在大学的时候,这些码都被我斩于马下!谁曾想,它们会来个回马枪,我真的是忘了! 

计算机的存储与计算采用数字的补码进行,假设计算机用一个字节(8位)来存储一个数:

  • 最高位,即最左边的位,为符号位,“0”表示正数,“1”表示负数
  • 正数的原码、反码、补码一致
  • 负数的原码最高位为“1”,其余和其对应的正数相同。
  • 负数的反码,在其原码的基础上,符号位不变,其余位按位取反。
  • 负数的补码,在其原码的基础上,符号位不变,其余位按位取反后,再加1。
  • 负数的补码再求补一次,会得到其的原码。 

例如:

12:

  • 原码:00001100
  • 反码:00001100
  • 补码:00001100

-12:

  • 原码:10001100
  • 反码:11110011
  • 补码:11110100

计算12-12==>12+(-12)==>00001100+11110100==>100000000==>只能存8位,最左位直接丢弃==>00000000==0 

那么,下面的结果是什么呢?

print(~12)

它居然是 -13 。

为什么呢?

解释:

12在计算机以补码形式存放为:00001100==>取反之后==>11110011==>print它==>对计算机来说,这是一个负数的补码==>这个负数的反码是11110010==>这个负数的原码是10001101==>这个负数是 -13

posted @ 2020-09-06 21:40  kunsile  阅读(759)  评论(0)    收藏  举报