MENU

文章目录

「原码 反码 补码」

2021 年 02 月 19 日 • 编程

原码

原码就是符号位 + 真值的绝对值得到的数值

  • 有符号的情况下 0000 0000~1111 1111 表示的范围是 -127~127
  • 无符号的情况下 0000 0000~1111 1111 表示的范围是 0~255

原码属于最接近人脑理解的表示形式,但是机器很难使用

  • 0000 00001000 0000会分别对应正零负零
  • 会出现 1(0000 0001)+-1(1000 0001)=-2(1000 0010)这样的负数运算问题

反码

反码就是在原码的基础上符号位不变,真值部分按位取反

  • 有符号的情况下 0000 0000~1111 1111 表示的范围是 -127~127
  • 无符号的情况下 0000 0000~1111 1111 表示的范围是 0~255

反码是在原码的基础上,对于负数运算的一种编码形式

  • 0000 00001111 1111会分别对应正零负零
  • 1(0000 0001)+-1(1111 1110)=0(1111 1111)因此,不会出现原码的那种问题

可以看到,虽然反码处理了负数运算的问题,但是依旧会存在正零负零

补码

补码就是在反码的基础上加 1,用于解决同时存在正零负零的这个问题

  • -1原码1000 0001反码1111 1110补码1111 1110+1=1111 1111=0xFF
  • -0原码1000 0000反码1111 1111补码1111 1111+1=0000 0000(溢出)

由此可见,在补码中,负零通过 +1 变成了正零

  • 有符号的情况下 0000 0000~1111 1111 表示的范围是 -128~127
  • 无符号的情况下 0000 0000~1111 1111 表示的范围是 0~255

负零消除了,会增加一个真值全为0的负数,所以补码的负数范围是-128,这一点口头描述起来比较抽象,得自己深入理解