原码、反码和补码的小知识

原码、反码和补码

  • 原码:5=>0b101  1=>0b1     假设计算机用原码表示负数:-1=>-0b1,但是计算机只有0和1,无法识别符号,由于数据总是有边界的,比如int占4字节,32位,则在最高位上,用0和1表示正符号,则有符号的int型范围是2^31-1,所以计算机表示负数的方式是用最高位表示符号
  • 反码:正数的反码与原码相同,负数的反码符号位不变,其余按位取反
  • 补码:正数的补码与原码相同,负数的反码符号位不变,其余按位取反+1

    为什么要用补码呢?

    因为逻辑电路设计起来太费劲,既要有加法器还有减法器,但是减法完全可以用加法代替,这种数字游戏可以用补码来做

    负数在计算机用补码存储,而正数,原码补码都一样(正数负数在计算机中都是用补码来描述的)

举个例子:

5-1=5+(-1) 直觉上 0b101 - 0b1 = 0b100 =4,其实在计算机中是0b101+0b1111 1111,溢出位舍弃

具体过程:

               5                      -1
原码    0000 0101      1000 0001

补码    0000 0101      1111 1110+1=1111 1111

于是 5+(-1)即:
    0000 0101+   1111 1111
    0000 0001+   1111 1111=1 0000 0000 溢出位舍弃,结果是 0000 0000
    0000 0100+0000 0000=0000 0100=4  (相当于把5拆成两部分加)

那么12的取反~12是多少呢?
首先12=0000 1100   取反是1111 0011 这是计算机能识别的补码,而不是对我们友好的原码,所以需要把他转为原码,即补码的补码为原码,1111 0011的补码是:
取反+1即: 1000 1100+1=1000 1101= -13

猜你喜欢

转载自blog.csdn.net/weixin_39504659/article/details/85162090