原码 反码 补码

377 阅读2分钟

计算机中有符号数的三种表示方法:原码,反码和补码。

原码

  1. 原码定义

原码(true form)是有符号数最简单的编码方式, 最高位是符号位,剩余位是数值位。数值位就是真值的绝对值。正数符号位为0,负数符号位是1 (0有两种表示: +0, -0)。

举例: 字长为8,8位二进制下,+11的原码是: 0000 1011,-11的原码是: 1000 1011 。 零的两种表示:+0原码是:0000 0000,-0原码是:1000 0000

  1. 原码优缺点

原码是一种计算机中对数字的二进制定点表示方法。

优点:简单直观

缺点:不能直接参加运算

举例:数学上 1+(-1)=0, 翻译成原码直接相加: 0000 0001 + 1000 0001 = 1000 0010 (-2) 是不对的,就是符号位不能直接参与运算,必须和其他数值位分开,这就增加了硬件的开销和复杂度。

  1. 表示范围

一个字长为n的机器数能表示的范围(不同数字的个数)是固定的2^n (2ⁿ)个无符号数字, n=8就是2^8=256个。

用来表示有符号数字,因为首位是符号位,实际的数字位是n-1个,计数范围是:-2^(n-1)-1 ~ 2^(n-1)-1, 2^n-1个数。 n=8时为:-127~127, 共255个数

反码

  1. 反码定义

正数的反码跟原码相同;负数的反码是(相对原码)保持符号位不变,将数值位按位取反。或者也可以这么说,负数的反码是将对应正数(绝对值)的原码全部按位取反获取的。

反码通常是用来由原码求补码或者由补码求原码过程中的过度码。

反码也是数值存储的一种,多应用于系统环境设置,如linux平台目录和文件的默认权限设置umask, 就是利用反码原理,umask是啥?

补码

  1. 补码定义

正数的补码跟其原码相同;负数的补码是在其反码的基础上在末位加1。

补码是计算机把减法运算转化为加法运算的关键编码。

  1. 怎么理解补码

  2. 编码转换

正数的原码,反码,补码均相同,不需要转换。

为什么补码的补码就是原码?

为什么“(补码-1)取反 = (补码取反)+1”